pax_global_header00006660000000000000000000000064125053372650014522gustar00rootroot0000000000000052 comment=49ec63065be33dbb1598bbfc22fdf0042c9103cb .gitignore000066400000000000000000000001211250533726500130500ustar00rootroot00000000000000*.mode* *.pbxuser *.xcworkspace xcuserdata .DS_Store build External/MobileVLCKit COPYING000066400000000000000000000636421250533726500121340ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! External/000077500000000000000000000000001250533726500126505ustar00rootroot00000000000000External/TouchXML/000077500000000000000000000000001250533726500143135ustar00rootroot00000000000000External/TouchXML/Source/000077500000000000000000000000001250533726500155535ustar00rootroot00000000000000External/TouchXML/Source/CXHTMLDocument.h000066400000000000000000000037211250533726500204250ustar00rootroot00000000000000// // CXHTMLDocument.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument.h" @interface CXHTMLDocument : CXMLDocument { } - (id)initWithXHTMLData:(NSData *)inData encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError; - (id)initWithXHTMLString:(NSString *)inString options:(NSUInteger)inOptions error:(NSError **)outError; @end External/TouchXML/Source/CXHTMLDocument.m000066400000000000000000000135641250533726500204400ustar00rootroot00000000000000// // CXHTMLDocument.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. // This is an experiment to see if we can utilize the HTMLParser functionality // of libXML to serve as a XHTML parser, I question if this is a good idea or not // need to test some of the following // [-] How are xml namespaces handled // [-] Can we support DTD // [-] #import "CXHTMLDocument.h" #include #include #include #include #import "CXMLNode_PrivateExtensions.h" #import "CXMLElement.h" #if TOUCHXMLUSETIDY #import "CTidy.h" #endif /* TOUCHXMLUSETIDY */ @implementation CXHTMLDocument // Differs from initWithXMLString by using libXML's HTML parser, which automatically decodes XHTML/HTML entities found within the document // which eliminates the need to resanitize strings extracted from the document // libXML treats a htmlDocPtr the same as xmlDocPtr - (id)initWithXHTMLString:(NSString *)inString options:(NSUInteger)inOptions error:(NSError **)outError { #pragma unused (inOptions) if ((self = [super init]) != NULL) { NSError *theError = NULL; htmlDocPtr theDoc = htmlParseDoc(BAD_CAST[inString UTF8String], xmlGetCharEncodingName(XML_CHAR_ENCODING_UTF8)); if (theDoc != NULL) { // TODO: change code to not depend on XPATH, should be a task simple enough to do // alternatively see if we can prevent the HTML parser from adding implied tags xmlXPathContextPtr xpathContext = xmlXPathNewContext (theDoc); xmlXPathObjectPtr xpathObject = NULL; if (xpathContext) xpathObject = xmlXPathEvalExpression (BAD_CAST("/html/body"), xpathContext); xmlNodePtr bodyNode = NULL; if (xpathObject && xpathObject->nodesetval->nodeMax) bodyNode = xpathObject->nodesetval->nodeTab[0]; // TODO: Determine if this is sufficient to handle memory in libXML, is the old root removed / deleted, etc if (bodyNode) xmlDocSetRootElement(theDoc, bodyNode->children); _node = (xmlNodePtr)theDoc; NSAssert(_node->_private == NULL, @"TODO"); _node->_private = (__bridge void *)(self); // Note. NOT retained (TODO think more about _private usage) if (xpathObject) xmlXPathFreeObject (xpathObject); if (xpathContext) xmlXPathFreeContext (xpathContext); } else { xmlErrorPtr theLastErrorPtr = xmlGetLastError(); NSDictionary *theUserInfo = @{NSLocalizedDescriptionKey: theLastErrorPtr ? @(theLastErrorPtr->message) : @"unknown"}; theError = [NSError errorWithDomain:@"CXMLErrorDomain" code:1 userInfo:theUserInfo]; xmlResetLastError(); } if (outError) { *outError = theError; } if (theError != NULL) { self = NULL; } } return(self); } - (id)initWithXHTMLData:(NSData *)inData encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError { #pragma unused (inOptions) if ((self = [super init]) != NULL) { NSError *theError = NULL; if (theError == NULL) { xmlDocPtr theDoc = NULL; if (inData && inData.length > 0) { CFStringEncoding cfenc = CFStringConvertNSStringEncodingToEncoding(encoding); CFStringRef cfencstr = CFStringConvertEncodingToIANACharSetName(cfenc); const char *enc = CFStringGetCStringPtr(cfencstr, 0); theDoc = htmlReadMemory([inData bytes], (int)[inData length], NULL, enc, HTML_PARSE_NONET | HTML_PARSE_NOBLANKS | HTML_PARSE_NOWARNING); } if (theDoc != NULL) { _node = (xmlNodePtr)theDoc; _node->_private = (__bridge void *)(self); // Note. NOT retained (TODO think more about _private usage) } else { theError = [NSError errorWithDomain:@"CXMLErrorDomain" code:-1 userInfo:NULL]; } } if (outError) { *outError = theError; } if (theError != NULL) { self = NULL; } } return(self); } @end External/TouchXML/Source/CXMLDocument.h000066400000000000000000000061351250533726500201730ustar00rootroot00000000000000// // CXMLDocument.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" enum { CXMLDocumentTidyHTML = 1 << 9, // Based on NSXMLDocumentTidyHTML CXMLDocumentTidyXML = 1 << 10, // Based on NSXMLDocumentTidyXML }; @class CXMLElement; @interface CXMLDocument : CXMLNode { NSMutableSet *nodePool; } - (id)initWithData:(NSData *)inData options:(NSUInteger)inOptions error:(NSError **)outError; - (id)initWithData:(NSData *)inData encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError; - (id)initWithXMLString:(NSString *)inString options:(NSUInteger)inOptions error:(NSError **)outError; - (id)initWithContentsOfURL:(NSURL *)inURL options:(NSUInteger)inOptions error:(NSError **)outError; - (id)initWithContentsOfURL:(NSURL *)inURL encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError; //- (NSString *)characterEncoding; //- (NSString *)version; //- (BOOL)isStandalone; //- (CXMLDocumentContentKind)documentContentKind; //- (NSString *)MIMEType; //- (CXMLDTD *)DTD; - (CXMLElement *)rootElement; - (NSData *)XMLData; - (NSData *)XMLDataWithOptions:(NSUInteger)options; //- (id)objectByApplyingXSLT:(NSData *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error; //- (id)objectByApplyingXSLTString:(NSString *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error; //- (id)objectByApplyingXSLTAtURL:(NSURL *)xsltURL arguments:(NSDictionary *)argument error:(NSError **)error; - (id)XMLStringWithOptions:(NSUInteger)options; @end External/TouchXML/Source/CXMLDocument.m000066400000000000000000000214271250533726500202010ustar00rootroot00000000000000// // CXMLDocument.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument.h" #include #import "CXMLNode_PrivateExtensions.h" #import "CXMLElement.h" #if TOUCHXMLUSETIDY #import "CTidy.h" #endif /* TOUCHXMLUSETIDY */ @implementation CXMLDocument - (id)initWithXMLString:(NSString *)inString options:(NSUInteger)inOptions error:(NSError **)outError { #pragma unused (inOptions) if ((self = [super init]) != NULL) { NSError *theError = NULL; #if TOUCHXMLUSETIDY if (inOptions & CXMLDocumentTidyHTML) { inString = [[CTidy tidy] tidyString:inString inputFormat:TidyFormat_HTML outputFormat:TidyFormat_XHTML diagnostics:NULL error:&theError]; } else if (inOptions & CXMLDocumentTidyXML) { inString = [[CTidy tidy] tidyString:inString inputFormat:TidyFormat_XML outputFormat:TidyFormat_XML diagnostics:NULL error:&theError]; } #endif xmlDocPtr theDoc = xmlParseDoc((xmlChar *)[inString UTF8String]); if (theDoc != NULL) { _node = (xmlNodePtr)theDoc; NSAssert(_node->_private == NULL, @"TODO"); _node->_private = (__bridge void *)(self); // Note. NOT retained (TODO think more about _private usage) } else { xmlErrorPtr theLastErrorPtr = xmlGetLastError(); NSString* message = @(theLastErrorPtr ? theLastErrorPtr->message : "Unknown error"); NSDictionary *theUserInfo = @{NSLocalizedDescriptionKey: message}; theError = [NSError errorWithDomain:@"CXMLErrorDomain" code:1 userInfo:theUserInfo]; xmlResetLastError(); } if (outError) *outError = theError; if (theError != NULL) { self = NULL; } } return(self); } - (id)initWithData:(NSData *)inData options:(NSUInteger)inOptions error:(NSError **)outError { return [self initWithData:inData encoding:NSUTF8StringEncoding options:inOptions error:outError]; } - (id)initWithData:(NSData *)inData encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError { #pragma unused (inOptions) if ((self = [super init]) != NULL) { NSError *theError = NULL; #if TOUCHXMLUSETIDY if (inOptions & CXMLDocumentTidyHTML) { inData = [[CTidy tidy] tidyData:inData inputFormat:TidyFormat_HTML outputFormat:TidyFormat_XHTML diagnostics:NULL error:&theError]; } else if (inOptions & CXMLDocumentTidyXML) { inData = [[CTidy tidy] tidyData:inData inputFormat:TidyFormat_XML outputFormat:TidyFormat_XML diagnostics:NULL error:&theError]; } #endif if (theError == NULL) { xmlDocPtr theDoc = NULL; if (inData && inData.length > 0) { CFStringEncoding cfenc = CFStringConvertNSStringEncodingToEncoding(encoding); CFStringRef cfencstr = CFStringConvertEncodingToIANACharSetName(cfenc); const char *enc = CFStringGetCStringPtr(cfencstr, 0); theDoc = xmlReadMemory([inData bytes], (int)[inData length], NULL, enc, XML_PARSE_RECOVER | XML_PARSE_NOWARNING); } if (theDoc != NULL && xmlDocGetRootElement(theDoc) != NULL) { _node = (xmlNodePtr)theDoc; _node->_private = (__bridge void *)(self); // Note. NOT retained (TODO think more about _private usage) } else { xmlErrorPtr theLastErrorPtr = xmlGetLastError(); NSString* message = @(theLastErrorPtr ? theLastErrorPtr->message : "Unknown error"); NSDictionary *theUserInfo = @{NSLocalizedDescriptionKey: message}; theError = [NSError errorWithDomain:@"CXMLErrorDomain" code:1 userInfo:theUserInfo]; xmlResetLastError(); } } if (outError) *outError = theError; if (theError != NULL) { self = NULL; } } return(self); } - (id)initWithContentsOfURL:(NSURL *)inURL options:(NSUInteger)inOptions error:(NSError **)outError { return [self initWithContentsOfURL:inURL encoding:NSUTF8StringEncoding options:inOptions error:outError]; } - (id)initWithContentsOfURL:(NSURL *)inURL encoding:(NSStringEncoding)encoding options:(NSUInteger)inOptions error:(NSError **)outError { if (outError) *outError = NULL; NSData *theData = [NSData dataWithContentsOfURL:inURL options:NSUncachedRead error:outError]; if (theData) { self = [self initWithData:theData encoding:encoding options:inOptions error:outError]; } else { self = NULL; } return(self); } - (void)dealloc { // Fix for #35 http://code.google.com/p/touchcode/issues/detail?id=35 -- clear up the node objects first (inside a pool so I _know_ they're cleared) and then freeing the document @autoreleasepool { for (CXMLNode *theNode in nodePool) { [theNode invalidate]; } nodePool = NULL; } // xmlUnlinkNode(_node); xmlFreeDoc((xmlDocPtr)_node); _node = NULL; } //- (NSString *)characterEncoding; //- (NSString *)version; //- (BOOL)isStandalone; //- (CXMLDocumentContentKind)documentContentKind; //- (NSString *)MIMEType; //- (CXMLDTD *)DTD; - (CXMLElement *)rootElement { xmlNodePtr theLibXMLNode = xmlDocGetRootElement((xmlDocPtr)_node); return([CXMLNode nodeWithLibXMLNode:theLibXMLNode freeOnDealloc:NO]); } - (NSData *)XMLData { return([self XMLDataWithOptions:0]); } - (NSData *)XMLDataWithOptions:(NSUInteger)options { #pragma unused (options) xmlChar *theBuffer = NULL; int theBufferSize = 0; xmlDocDumpMemory((xmlDocPtr)self->_node, &theBuffer, &theBufferSize); NSData *theData = [NSData dataWithBytes:theBuffer length:theBufferSize]; xmlFree(theBuffer); return(theData); } //- (id)objectByApplyingXSLT:(NSData *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error; //- (id)objectByApplyingXSLTString:(NSString *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error; //- (id)objectByApplyingXSLTAtURL:(NSURL *)xsltURL arguments:(NSDictionary *)argument error:(NSError **)error; - (id)XMLStringWithOptions:(NSUInteger)options { CXMLElement *theRoot = [self rootElement]; NSMutableString *xmlString = [NSMutableString string]; [xmlString appendString:[theRoot XMLStringWithOptions:options]]; return xmlString; } - (NSString *)description { NSAssert(_node != NULL, @"TODO"); NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p [%p]> ", NSStringFromClass([self class]), self, self->_node]; xmlChar *xmlbuff; int buffersize; xmlDocDumpFormatMemory((xmlDocPtr)(self->_node), &xmlbuff, &buffersize, 1); NSString *dump = [[NSString alloc] initWithBytes:xmlbuff length:buffersize encoding:NSUTF8StringEncoding]; xmlFree(xmlbuff); [result appendString:dump]; return result; } @end External/TouchXML/Source/CXMLDocument_PrivateExtensions.h000066400000000000000000000036561250533726500237520ustar00rootroot00000000000000// // CXMLDocument_PrivateExtensions.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument.h" #include @interface CXMLDocument (CXMLDocument_PrivateExtensions) //- (id)initWithLibXmlParserContext:(xmlParserCtxtPtr)inContext options:(NSUInteger)inOptions error:(NSError **)outError; - (NSMutableSet *)nodePool; @end External/TouchXML/Source/CXMLDocument_PrivateExtensions.m000066400000000000000000000041161250533726500237470ustar00rootroot00000000000000// // CXMLDocument_PrivateExtensions.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument_PrivateExtensions.h" @implementation CXMLDocument (CXMLDocument_PrivateExtensions) /* - (id)initWithLibXmlParserContext:(xmlParserCtxtPtr)inContext options:(NSUInteger)inOptions error:(NSError **)outError { xmlParseDocument(inContext); } */ - (NSMutableSet *)nodePool { if (nodePool == NULL) { nodePool = [[NSMutableSet alloc] init]; } return(nodePool); } @end External/TouchXML/Source/CXMLElement.h000066400000000000000000000044441250533726500200070ustar00rootroot00000000000000// // CXMLElement.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" // NSXMLElement @interface CXMLElement : CXMLNode { } - (NSArray *)elementsForName:(NSString *)name; - (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)URI; - (NSArray *)attributes; - (CXMLNode *)attributeForName:(NSString *)name; - (CXMLNode *)attributeForLocalName:(NSString *)localName URI:(NSString *)URI; - (NSArray *)namespaces; - (CXMLNode *)namespaceForPrefix:(NSString *)name; - (CXMLNode *)resolveNamespaceForName:(NSString *)name; - (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI; //- (NSString*)_XMLStringWithOptions:(NSUInteger)options appendingToString:(NSMutableString*)str; @end External/TouchXML/Source/CXMLElement.m000066400000000000000000000225061250533726500200130ustar00rootroot00000000000000// // CXMLElement.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLElement.h" #import "CXMLNode_PrivateExtensions.h" #import "CXMLNode_CreationExtensions.h" #import "CXMLNamespaceNode.h" @implementation CXMLElement - (NSArray *)elementsForName:(NSString *)name { NSMutableArray *theElements = [NSMutableArray array]; // TODO -- native xml api? const xmlChar *theName = (const xmlChar *)[name UTF8String]; xmlNodePtr theCurrentNode = _node->children; while (theCurrentNode != NULL) { if (theCurrentNode->type == XML_ELEMENT_NODE && xmlStrcmp(theName, theCurrentNode->name) == 0) { CXMLNode *theNode = [CXMLNode nodeWithLibXMLNode:(xmlNodePtr)theCurrentNode freeOnDealloc:NO]; [theElements addObject:theNode]; } theCurrentNode = theCurrentNode->next; } return(theElements); } - (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)URI { if (URI == nil || [URI length] == 0) { return [self elementsForName:localName]; } NSMutableArray *theElements = [NSMutableArray array]; const xmlChar *theLocalName = (const xmlChar *)[localName UTF8String]; const xmlChar *theNamespaceName = (const xmlChar *)[URI UTF8String]; xmlNodePtr theCurrentNode = _node->children; while (theCurrentNode != NULL) { if (theCurrentNode->type == XML_ELEMENT_NODE && xmlStrcmp(theLocalName, theCurrentNode->name) == 0 && theCurrentNode->ns && xmlStrcmp(theNamespaceName, theCurrentNode->ns->href) == 0) { CXMLNode *theNode = [CXMLNode nodeWithLibXMLNode:(xmlNodePtr)theCurrentNode freeOnDealloc:NO]; [theElements addObject:theNode]; } theCurrentNode = theCurrentNode->next; } return theElements; } - (NSArray *)attributes { NSMutableArray *theAttributes = [NSMutableArray array]; xmlAttrPtr theCurrentNode = _node->properties; while (theCurrentNode != NULL) { CXMLNode *theAttribute = [CXMLNode nodeWithLibXMLNode:(xmlNodePtr)theCurrentNode freeOnDealloc:NO]; [theAttributes addObject:theAttribute]; theCurrentNode = theCurrentNode->next; } return(theAttributes); } - (CXMLNode *)attributeForName:(NSString *)name { // TODO -- look for native libxml2 function for finding a named attribute (like xmlGetProp) NSRange split = [name rangeOfString:@":"]; xmlChar *theLocalName = NULL; xmlChar *thePrefix = NULL; if (split.length > 0) { theLocalName = (xmlChar *)[[name substringFromIndex:split.location + 1] UTF8String]; thePrefix = (xmlChar *)[[name substringToIndex:split.location] UTF8String]; } else { theLocalName = (xmlChar *)[name UTF8String]; } xmlAttrPtr theCurrentNode = _node->properties; while (theCurrentNode != NULL) { if (xmlStrcmp(theLocalName, theCurrentNode->name) == 0) { if (thePrefix == NULL || (theCurrentNode->ns && theCurrentNode->ns->prefix && xmlStrcmp(thePrefix, theCurrentNode->ns->prefix) == 0)) { CXMLNode *theAttribute = [CXMLNode nodeWithLibXMLNode:(xmlNodePtr)theCurrentNode freeOnDealloc:NO]; return(theAttribute); } } theCurrentNode = theCurrentNode->next; } return(NULL); } - (CXMLNode *)attributeForLocalName:(NSString *)localName URI:(NSString *)URI { if (URI == nil) { return [self attributeForName:localName]; } // TODO -- look for native libxml2 function for finding a named attribute (like xmlGetProp) const xmlChar *theLocalName = (const xmlChar *)[localName UTF8String]; const xmlChar *theNamespaceName = (const xmlChar *)[URI UTF8String]; xmlAttrPtr theCurrentNode = _node->properties; while (theCurrentNode != NULL) { if (theCurrentNode->ns && theCurrentNode->ns->href && xmlStrcmp(theLocalName, theCurrentNode->name) == 0 && xmlStrcmp(theNamespaceName, theCurrentNode->ns->href) == 0) { CXMLNode *theAttribute = [CXMLNode nodeWithLibXMLNode:(xmlNodePtr)theCurrentNode freeOnDealloc:NO]; return(theAttribute); } theCurrentNode = theCurrentNode->next; } return(NULL); } - (NSArray *)namespaces { NSMutableArray *theNamespaces = [[NSMutableArray alloc] init]; xmlNsPtr theCurrentNamespace = _node->nsDef; while (theCurrentNamespace != NULL) { NSString *thePrefix = theCurrentNamespace->prefix ? @((const char *)theCurrentNamespace->prefix) : @""; NSString *theURI = @((const char *)theCurrentNamespace->href); CXMLNamespaceNode *theNode = [[CXMLNamespaceNode alloc] initWithPrefix:thePrefix URI:theURI parentElement:self]; [theNamespaces addObject:theNode]; theCurrentNamespace = theCurrentNamespace->next; } return theNamespaces; } - (CXMLNode *)namespaceForPrefix:(NSString *)name { const xmlChar *thePrefix = (const xmlChar *)[name UTF8String]; xmlNsPtr theCurrentNamespace = _node->nsDef; while (theCurrentNamespace != NULL) { if (xmlStrcmp(theCurrentNamespace->prefix, thePrefix) == 0) { NSString *thePrefixString = theCurrentNamespace->prefix ? @((const char *)theCurrentNamespace->prefix) : @""; NSString *theURI = @((const char *)theCurrentNamespace->href); return [[CXMLNamespaceNode alloc] initWithPrefix:thePrefixString URI:theURI parentElement:self]; } theCurrentNamespace = theCurrentNamespace->next; } return nil; } - (CXMLNode *)resolveNamespaceForName:(NSString *)name { NSRange split = [name rangeOfString:@":"]; if (split.length > 0) return [self namespaceForPrefix:[name substringToIndex:split.location]]; xmlNsPtr theCurrentNamespace = _node->nsDef; while (theCurrentNamespace != NULL) { if (theCurrentNamespace->prefix == 0 || (theCurrentNamespace->prefix)[0] == 0) { NSString *thePrefix = theCurrentNamespace->prefix ? @((const char *)theCurrentNamespace->prefix) : @""; NSString *theURI = @((const char *)theCurrentNamespace->href); return [[CXMLNamespaceNode alloc] initWithPrefix:thePrefix URI:theURI parentElement:self]; } theCurrentNamespace = theCurrentNamespace->next; } return nil; } - (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI { const xmlChar *theXMLURI = (const xmlChar *)[namespaceURI UTF8String]; xmlNsPtr theCurrentNamespace = _node->nsDef; while (theCurrentNamespace != NULL) { if (xmlStrcmp(theCurrentNamespace->href, theXMLURI) == 0) { if(theCurrentNamespace->prefix) return @((const char *)theCurrentNamespace->prefix); return @""; } theCurrentNamespace = theCurrentNamespace->next; } return nil; } //- (NSString*)_XMLStringWithOptions:(NSUInteger)options appendingToString:(NSMutableString*)str //{ //NSString* name = [self name]; //[str appendString:[NSString stringWithFormat:@"<%@", name]]; // //for (id attribute in [self attributes] ) // { // [attribute _XMLStringWithOptions:options appendingToString:str]; // } // //if ( ! _node->children ) // { // bool isEmpty = NO; // NSArray *emptyTags = [NSArray arrayWithObjects: @"br", @"area", @"link", @"img", @"param", @"hr", @"input", @"col", @"base", @"meta", nil ]; // for (id s in emptyTags) // { // if ( [s isEqualToString:@"base"] ) // { // isEmpty = YES; // break; // } // } // if ( isEmpty ) // { // [str appendString:@"/>"]; // return str; // } // } // //[str appendString:@">"]; // //if ( _node->children ) // { // for (id child in [self children]) // [child _XMLStringWithOptions:options appendingToString:str]; // } //[str appendString:[NSString stringWithFormat:@"", name]]; //return str; //} - (NSString *)description { NSAssert(_node != NULL, @"TODO"); return([NSString stringWithFormat:@"<%@ %p [%p] %@ %@>", NSStringFromClass([self class]), self, self->_node, [self name], [self XMLStringWithOptions:0]]); } @end External/TouchXML/Source/CXMLElement_CreationExtensions.h000066400000000000000000000035151250533726500237110ustar00rootroot00000000000000// // CXMLElement_CreationExtensions.h // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLElement.h" @interface CXMLElement (CXMLElement_CreationExtensions) - (void)addChild:(CXMLNode *)inNode; - (void)addNamespace:(CXMLNode *)inNamespace; @end External/TouchXML/Source/CXMLElement_CreationExtensions.m000066400000000000000000000051461250533726500237200ustar00rootroot00000000000000// // CXMLElement_CreationExtensions.m // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLElement_CreationExtensions.h" @implementation CXMLElement (CXMLElement_CreationExtensions) - (void)addChild:(CXMLNode *)inNode { NSAssert(inNode->_node->doc == NULL, @"Cannot addChild with a node that already is part of a document. Copy it first!"); NSAssert(self->_node != NULL, @"_node should not be null"); NSAssert(inNode->_node != NULL, @"_node should not be null"); xmlAddChild(self->_node, inNode->_node); // now XML element is tracked by document, do not release on dealloc inNode->_freeNodeOnRelease = NO; } - (void)addNamespace:(CXMLNode *)inNamespace { xmlSetNs(self->_node, (xmlNsPtr)inNamespace->_node); } - (void)setStringValue:(NSString *)inStringValue { NSAssert(inStringValue != NULL, @"CXMLElement setStringValue should not be null"); xmlNodePtr theContentNode = xmlNewText((const xmlChar *)[inStringValue UTF8String]); NSAssert(self->_node != NULL, @"_node should not be null"); xmlAddChild(self->_node, theContentNode); } @end External/TouchXML/Source/CXMLElement_ElementTreeExtensions.h000066400000000000000000000034601250533726500243550ustar00rootroot00000000000000// // CXMLElement_ElementTreeExtensions.h // TouchCode // // Created by Jonathan Wight on 11/14/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLElement.h" @interface CXMLElement (CXMLElement_ElementTreeExtensions) - (CXMLElement *)subelement:(NSString *)inName; @end External/TouchXML/Source/CXMLElement_ElementTreeExtensions.m000066400000000000000000000040301250533726500243540ustar00rootroot00000000000000// // CXMLElement_ElementTreeExtensions.m // TouchCode // // Created by Jonathan Wight on 11/14/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLElement_ElementTreeExtensions.h" #import "CXMLElement_CreationExtensions.h" #import "CXMLNode_CreationExtensions.h" @implementation CXMLElement (CXMLElement_ElementTreeExtensions) - (CXMLElement *)subelement:(NSString *)inName; { CXMLElement *theSubelement = [CXMLNode elementWithName:inName]; [self addChild:theSubelement]; return(theSubelement); } @end External/TouchXML/Source/CXMLNamespaceNode.h000066400000000000000000000036651250533726500211240ustar00rootroot00000000000000// // CXMLNamespaceNode.h // TouchXML // // Created by Jonathan Wight on 1/1/2000. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import #import "CXMLNode.h" #import "CXMLElement.h" @interface CXMLNamespaceNode : CXMLNode { NSString *_prefix; NSString *_uri; CXMLElement *_parent; } - (id) initWithPrefix:(NSString *)prefix URI:(NSString *)uri parentElement:(CXMLElement *)parent; @end External/TouchXML/Source/CXMLNamespaceNode.m000066400000000000000000000074421250533726500211260ustar00rootroot00000000000000// // CXMLNamespaceNode.m // TouchXML // // Created by Jonathan Wight on 1/1/2000. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNamespaceNode.h" @implementation CXMLNamespaceNode #pragma mark - #pragma mark Init and dealloc - (id) initWithPrefix:(NSString *)prefix URI:(NSString *)uri parentElement:(CXMLElement *)parent { if ((self = [super init]) != NULL) { _prefix = [prefix copy]; _uri = [uri copy]; _parent = parent; // Don't retain parent } return self; } - (void) dealloc { _prefix = nil; _uri = nil; _parent = nil; // Parent not retained } #pragma mark - #pragma mark Overidden methods // NB: We need to override every method that relies on _node as namespaces in libXML don't have a xmlNode - (CXMLNodeKind)kind { return CXMLNamespaceKind; } - (NSString *)name { return _prefix ? [_prefix copy] : @""; } - (NSString *)stringValue { return _uri ? [_uri copy] : @""; } - (NSUInteger)index { return 0; // TODO: Write tets, Fix } - (NSUInteger)level { return _parent ? [_parent level] + 1 : 2; } - (CXMLDocument *)rootDocument { return [_parent rootDocument]; } - (CXMLNode *)parent { return _parent; } - (NSUInteger)childCount { return 0; } - (NSArray *)children { return nil; } - (CXMLNode *)childAtIndex:(NSUInteger)index { return nil; } - (CXMLNode *)previousSibling { return nil; // TODO: Write tets, Fix } - (CXMLNode *)nextSibling { return nil; // TODO: Write tets, Fix } //- (CXMLNode *)previousNode; //- (CXMLNode *)nextNode; //- (NSString *)XPath; - (NSString *)localName { return [self name]; } - (NSString *)prefix { return @""; } - (NSString *)URI { return nil; } //+ (NSString *)localNameForName:(NSString *)name; //+ (NSString *)prefixForName:(NSString *)name; //+ (CXMLNode *)predefinedNamespaceForPrefix:(NSString *)name; - (NSString *)description { if (_prefix && [_prefix length] > 0) return [NSString stringWithFormat:@"xmlns:%@=\"%@\"", _prefix, _uri]; return [NSString stringWithFormat:@"xmlns=\"%@\"", _uri]; } - (NSString *)XMLString { return [self description]; } - (NSString *)XMLStringWithOptions:(NSUInteger)options { return [self description]; } //- (NSString *)canonicalXMLStringPreservingComments:(BOOL)comments; - (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error { return nil; } @end External/TouchXML/Source/CXMLNode.h000066400000000000000000000062611250533726500173020ustar00rootroot00000000000000// // CXMLNode.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import #include typedef enum { CXMLInvalidKind = 0, CXMLElementKind = XML_ELEMENT_NODE, CXMLAttributeKind = XML_ATTRIBUTE_NODE, CXMLTextKind = XML_TEXT_NODE, CXMLProcessingInstructionKind = XML_PI_NODE, CXMLCommentKind = XML_COMMENT_NODE, CXMLNotationDeclarationKind = XML_NOTATION_NODE, CXMLDTDKind = XML_DTD_NODE, CXMLElementDeclarationKind = XML_ELEMENT_DECL, CXMLAttributeDeclarationKind = XML_ATTRIBUTE_DECL, CXMLEntityDeclarationKind = XML_ENTITY_DECL, CXMLNamespaceKind = XML_NAMESPACE_DECL, } CXMLNodeKind; @class CXMLDocument; // NSXMLNode @interface CXMLNode : NSObject { xmlNodePtr _node; BOOL _freeNodeOnRelease; } - (CXMLNodeKind)kind; - (NSString *)name; - (NSString *)stringValue; - (NSUInteger)index; - (NSUInteger)level; - (CXMLDocument *)rootDocument; - (CXMLNode *)parent; - (NSUInteger)childCount; - (NSArray *)children; - (CXMLNode *)childAtIndex:(NSUInteger)index; - (CXMLNode *)previousSibling; - (CXMLNode *)nextSibling; //- (CXMLNode *)previousNode; //- (CXMLNode *)nextNode; //- (NSString *)XPath; - (NSString *)localName; - (NSString *)prefix; - (NSString *)URI; + (NSString *)localNameForName:(NSString *)name; + (NSString *)prefixForName:(NSString *)name; + (CXMLNode *)predefinedNamespaceForPrefix:(NSString *)name; - (NSString *)description; - (NSString *)XMLString; - (NSString *)XMLStringWithOptions:(NSUInteger)options; //- (NSString *)canonicalXMLStringPreservingComments:(BOOL)comments; - (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error; @end External/TouchXML/Source/CXMLNode.m000066400000000000000000000237751250533726500173200ustar00rootroot00000000000000// // CXMLNode.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" #import "CXMLNode_PrivateExtensions.h" #import "CXMLDocument.h" #import "CXMLElement.h" #import "CXMLNode_CreationExtensions.h" #include #include #include static int MyXmlOutputWriteCallback(void * context, const char * buffer, int len); static int MyXmlOutputCloseCallback(void * context); @implementation CXMLNode - (void)dealloc { [self invalidate]; // } - (id)copyWithZone:(NSZone *)zone; { #pragma unused (zone) xmlNodePtr theNewNode = xmlCopyNode(_node, 1); CXMLNode *theNode = [[[self class] alloc] initWithLibXMLNode:theNewNode freeOnDealloc:YES]; theNewNode->_private = (__bridge void *)(theNode); return(theNode); } #pragma mark - - (CXMLNodeKind)kind { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); return((CXMLNodeKind)_node->type); // TODO this isn't 100% accurate! } - (NSString *)name { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); // TODO use xmlCheckUTF8 to check name if (_node->name == NULL) return(NULL); NSString *localName = @((const char *)_node->name); if (_node->ns == NULL || _node->ns->prefix == NULL) return localName; return [NSString stringWithFormat:@"%@:%@", @((const char *)_node->ns->prefix), localName]; } - (NSString *)stringValue { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); if (_node->type == XML_TEXT_NODE || _node->type == XML_CDATA_SECTION_NODE) return @((const char *)_node->content); if (_node->type == XML_ATTRIBUTE_NODE) return @((const char *)_node->children->content); NSMutableString *theStringValue = [[NSMutableString alloc] init]; for (CXMLNode *child in [self children]) { [theStringValue appendString:[child stringValue]]; } return theStringValue; } - (NSUInteger)index { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); xmlNodePtr theCurrentNode = _node->prev; NSUInteger N; for (N = 0; theCurrentNode != NULL; ++N, theCurrentNode = theCurrentNode->prev) ; return(N); } - (NSUInteger)level { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); xmlNodePtr theCurrentNode = _node->parent; NSUInteger N; for (N = 0; theCurrentNode != NULL; ++N, theCurrentNode = theCurrentNode->parent) ; return(N); } - (CXMLDocument *)rootDocument { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); return(__bridge CXMLDocument *)((_node->doc->_private)); } - (CXMLNode *)parent { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); if (_node->parent == NULL) return(NULL); else return (__bridge CXMLNode *)((_node->parent->_private)); } - (NSUInteger)childCount { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); if (_node->type == CXMLAttributeKind) return 0; // NSXMLNodes of type NSXMLAttributeKind can't have children xmlNodePtr theCurrentNode = _node->children; NSUInteger N; for (N = 0; theCurrentNode != NULL; ++N, theCurrentNode = theCurrentNode->next) ; return(N); } - (NSArray *)children { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); NSMutableArray *theChildren = [NSMutableArray array]; if (_node->type != CXMLAttributeKind) // NSXML Attribs don't have children. { xmlNodePtr theCurrentNode = _node->children; while (theCurrentNode != NULL) { CXMLNode *theNode = [CXMLNode nodeWithLibXMLNode:theCurrentNode freeOnDealloc:NO]; [theChildren addObject:theNode]; theCurrentNode = theCurrentNode->next; } } return(theChildren); } - (CXMLNode *)childAtIndex:(NSUInteger)index { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); xmlNodePtr theCurrentNode = _node->children; NSUInteger N; for (N = 0; theCurrentNode != NULL && N != index; ++N, theCurrentNode = theCurrentNode->next) ; if (theCurrentNode) return([CXMLNode nodeWithLibXMLNode:theCurrentNode freeOnDealloc:NO]); return(NULL); } - (CXMLNode *)previousSibling { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); if (_node->prev == NULL) return(NULL); else return([CXMLNode nodeWithLibXMLNode:_node->prev freeOnDealloc:NO]); } - (CXMLNode *)nextSibling { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); if (_node->next == NULL) return(NULL); else return([CXMLNode nodeWithLibXMLNode:_node->next freeOnDealloc:NO]); } //- (CXMLNode *)previousNode; //- (CXMLNode *)nextNode; //- (NSString *)XPath; - (NSString *)localName { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); // TODO use xmlCheckUTF8 to check name if (_node->name == NULL) return(NULL); else return(@((const char *)_node->name)); } - (NSString *)prefix { if (_node->ns && _node->ns->prefix) return(@((const char *)_node->ns->prefix)); else return(@""); } - (NSString *)URI { if (_node->ns) return(@((const char *)_node->ns->href)); else return(NULL); } + (NSString *)localNameForName:(NSString *)name { NSRange split = [name rangeOfString:@":"]; if (split.length > 0) return [name substringFromIndex:split.location + 1]; return name; } + (NSString *)prefixForName:(NSString *)name { NSRange split = [name rangeOfString:@":"]; if (split.length > 0) return [name substringToIndex:split.location]; return @""; } + (CXMLNode *)predefinedNamespaceForPrefix:(NSString *)name { if ([name isEqualToString:@"xml"]) return [CXMLNode namespaceWithName:@"xml" stringValue:@"http://www.w3.org/XML/1998/namespace"]; if ([name isEqualToString:@"xs"]) return [CXMLNode namespaceWithName:@"xs" stringValue:@"http://www.w3.org/2001/XMLSchema"]; if ([name isEqualToString:@"xsi"]) return [CXMLNode namespaceWithName:@"xsi" stringValue:@"http://www.w3.org/2001/XMLSchema-instance"]; if ([name isEqualToString:@"xmlns"]) // Not in Cocoa, but should be as it's reserved by W3C return [CXMLNode namespaceWithName:@"xmlns" stringValue:@"http://www.w3.org/2000/xmlns/"]; return nil; } - (NSString *)description { NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); return([NSString stringWithFormat:@"<%@ %p [%p] %@ %@>", NSStringFromClass([self class]), self, self->_node, [self name], [self XMLStringWithOptions:0]]); } - (NSString *)XMLString { return([self XMLStringWithOptions:0]); } - (NSString *)XMLStringWithOptions:(NSUInteger)options { #pragma unused (options) NSMutableData *theData = [[NSMutableData alloc] init]; xmlOutputBufferPtr theOutputBuffer = xmlOutputBufferCreateIO(MyXmlOutputWriteCallback, MyXmlOutputCloseCallback, (__bridge void *)(theData), NULL); xmlNodeDumpOutput(theOutputBuffer, _node->doc, _node, 0, 0, "utf-8"); xmlOutputBufferFlush(theOutputBuffer); NSString *theString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding]; xmlOutputBufferClose(theOutputBuffer); return(theString); } //- (NSString *)canonicalXMLStringPreservingComments:(BOOL)comments; - (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error { #pragma unused (error) NSAssert(_node != NULL, @"CXMLNode does not have attached libxml2 _node."); NSArray *theResult = NULL; xmlXPathContextPtr theXPathContext = xmlXPathNewContext(_node->doc); theXPathContext->node = _node; // TODO considering putting xmlChar <-> UTF8 into a NSString category xmlXPathObjectPtr theXPathObject = xmlXPathEvalExpression((const xmlChar *)[xpath UTF8String], theXPathContext); if (theXPathObject == NULL) { if (error) *error = [NSError errorWithDomain:@"TODO_DOMAIN" code:-1 userInfo:NULL]; return(NULL); } if (xmlXPathNodeSetIsEmpty(theXPathObject->nodesetval)) theResult = @[]; // TODO better to return NULL? else { NSMutableArray *theArray = [NSMutableArray array]; int N; for (N = 0; N < theXPathObject->nodesetval->nodeNr; N++) { xmlNodePtr theNode = theXPathObject->nodesetval->nodeTab[N]; [theArray addObject:[CXMLNode nodeWithLibXMLNode:theNode freeOnDealloc:NO]]; } theResult = theArray; } xmlXPathFreeObject(theXPathObject); xmlXPathFreeContext(theXPathContext); return(theResult); } //- (NSArray *)objectsForXQuery:(NSString *)xquery constants:(NSDictionary *)constants error:(NSError **)error; //- (NSArray *)objectsForXQuery:(NSString *)xquery error:(NSError **)error; @end static int MyXmlOutputWriteCallback(void * context, const char * buffer, int len) { NSMutableData *theData = (__bridge NSMutableData *)(context); [theData appendBytes:buffer length:len]; return(len); } static int MyXmlOutputCloseCallback(void * context) { return(0); } External/TouchXML/Source/CXMLNode_PrivateExtensions.h000066400000000000000000000037511250533726500230550ustar00rootroot00000000000000// // CXMLNode_PrivateExtensions.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" @interface CXMLNode (CXMLNode_PrivateExtensions) @property (readonly, nonatomic, assign) xmlNodePtr node; - (id)initWithLibXMLNode:(xmlNodePtr)inLibXMLNode freeOnDealloc:(BOOL)infreeOnDealloc; + (id)nodeWithLibXMLNode:(xmlNodePtr)inLibXMLNode freeOnDealloc:(BOOL)infreeOnDealloc; - (void)invalidate; @end External/TouchXML/Source/CXMLNode_PrivateExtensions.m000066400000000000000000000067601250533726500230650ustar00rootroot00000000000000// // CXMLNode_PrivateExtensions.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode_PrivateExtensions.h" #import "CXMLElement.h" #import "CXMLDocument_PrivateExtensions.h" @implementation CXMLNode (CXMLNode_PrivateExtensions) - (id)initWithLibXMLNode:(xmlNodePtr)inLibXMLNode freeOnDealloc:(BOOL)infreeOnDealloc { if (inLibXMLNode == NULL) return nil; if ((self = [super init]) != NULL) { _node = inLibXMLNode; _freeNodeOnRelease = infreeOnDealloc; } return(self); } + (id)nodeWithLibXMLNode:(xmlNodePtr)inLibXMLNode freeOnDealloc:(BOOL)infreeOnDealloc { // TODO more checking. if (inLibXMLNode == NULL) return nil; if (inLibXMLNode->_private) return(__bridge id)(inLibXMLNode->_private); Class theClass = [CXMLNode class]; switch (inLibXMLNode->type) { case XML_ELEMENT_NODE: theClass = [CXMLElement class]; break; case XML_DOCUMENT_NODE: theClass = [CXMLDocument class]; break; case XML_ATTRIBUTE_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_COMMENT_NODE: break; default: NSAssert1(NO, @"TODO Unhandled type (%d).", inLibXMLNode->type); return(NULL); } CXMLNode *theNode = [[theClass alloc] initWithLibXMLNode:inLibXMLNode freeOnDealloc:infreeOnDealloc]; if (inLibXMLNode->doc != NULL) { CXMLDocument *theXMLDocument = (__bridge CXMLDocument *)(inLibXMLNode->doc->_private); if (theXMLDocument != NULL) { NSAssert([theXMLDocument isKindOfClass:[CXMLDocument class]] == YES, @"TODO"); [[theXMLDocument nodePool] addObject:theNode]; theNode->_node->_private = (__bridge void *)(theNode); } } return(theNode); } - (xmlNodePtr)node { return(_node); } - (void)invalidate; { if (_node) { if (_node->_private == (__bridge void *)(self)) _node->_private = NULL; if (_freeNodeOnRelease) { xmlUnlinkNode(_node); xmlFreeNode(_node); } _node = NULL; } } @end External/TouchXML/Source/CXMLNode_XPathExtensions.h000066400000000000000000000036541250533726500224710ustar00rootroot00000000000000// // CXMLNode_XPathExtensions.h // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" @interface CXMLNode (CXMLNode_XPathExtensions) - (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error; - (CXMLNode *)nodeForXPath:(NSString *)xpath error:(NSError **)outError; @end External/TouchXML/Source/CXMLNode_XPathExtensions.m000066400000000000000000000065061250533726500224750ustar00rootroot00000000000000// // CXMLNode_XPathExtensions.m // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode_XPathExtensions.h" #import "CXMLDocument.h" #import "CXMLDocument_PrivateExtensions.h" #import "CXMLNode_PrivateExtensions.h" #include #include @implementation CXMLNode (CXMLNode_NamespaceExtensions) - (NSArray *)nodesForXPath:(NSString *)xpath namespaceMappings:(NSDictionary *)inNamespaceMappings error:(NSError **)error; { #pragma unused (error) NSAssert(_node != NULL, @"TODO"); NSArray *theResult = NULL; xmlXPathContextPtr theXPathContext = xmlXPathNewContext(_node->doc); theXPathContext->node = _node; for (NSString *thePrefix in inNamespaceMappings) { xmlXPathRegisterNs(theXPathContext, (xmlChar *)[thePrefix UTF8String], (xmlChar *)[inNamespaceMappings[thePrefix] UTF8String]); } // TODO considering putting xmlChar <-> UTF8 into a NSString category xmlXPathObjectPtr theXPathObject = xmlXPathEvalExpression((const xmlChar *)[xpath UTF8String], theXPathContext); if (xmlXPathNodeSetIsEmpty(theXPathObject->nodesetval)) theResult = @[]; // TODO better to return NULL? else { NSMutableArray *theArray = [NSMutableArray array]; int N; for (N = 0; N < theXPathObject->nodesetval->nodeNr; N++) { xmlNodePtr theLibXMLNode = theXPathObject->nodesetval->nodeTab[N]; CXMLNode *theNode = [CXMLNode nodeWithLibXMLNode:theLibXMLNode freeOnDealloc:YES]; [self.rootDocument.nodePool addObject:theNode]; [theArray addObject:theNode]; } theResult = theArray; } xmlXPathFreeObject(theXPathObject); xmlXPathFreeContext(theXPathContext); return(theResult); } - (CXMLNode *)nodeForXPath:(NSString *)xpath error:(NSError **)outError { return([[self nodesForXPath:xpath error:outError] lastObject]); } @end External/TouchXML/Source/Creation/000077500000000000000000000000001250533726500173175ustar00rootroot00000000000000External/TouchXML/Source/Creation/CXMLDocument_CreationExtensions.h000066400000000000000000000047041250533726500256430ustar00rootroot00000000000000// // CXMLDocument_CreationExtensions.h // TouchCode // // Created by Jonathan Wight on 11/11/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument.h" @interface CXMLDocument (CXMLDocument_CreationExtensions) //- (void)setVersion:(NSString *)version; //primitive //- (void)setStandalone:(BOOL)standalone; //primitive //- (void)setDocumentContentKind:(CXMLDocumentContentKind)kind; //primitive //- (void)setMIMEType:(NSString *)MIMEType; //primitive //- (void)setDTD:(CXMLDTD *)documentTypeDeclaration; //primitive //- (void)setRootElement:(CXMLNode *)root; - (void)insertChild:(CXMLNode *)child atIndex:(NSUInteger)index; //- (void)insertChildren:(NSArray *)children atIndex:(NSUInteger)index; //- (void)removeChildAtIndex:(NSUInteger)index; //primitive //- (void)setChildren:(NSArray *)children; //primitive - (void)addChild:(CXMLNode *)child; //- (void)replaceChildAtIndex:(NSUInteger)index withNode:(CXMLNode *)node; @end External/TouchXML/Source/Creation/CXMLDocument_CreationExtensions.m000066400000000000000000000043031250533726500256430ustar00rootroot00000000000000// // CXMLDocument_CreationExtensions.m // TouchCode // // Created by Jonathan Wight on 11/11/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument_CreationExtensions.h" #import "CXMLElement.h" #import "CXMLNode_PrivateExtensions.h" #import "CXMLDocument_PrivateExtensions.h" @implementation CXMLDocument (CXMLDocument_CreationExtensions) - (void)insertChild:(CXMLNode *)child atIndex:(NSUInteger)index { [self.nodePool addObject:child]; CXMLNode *theCurrentNode = (self.children)[index]; xmlAddPrevSibling(theCurrentNode->_node, child->_node); } - (void)addChild:(CXMLNode *)child { [self.nodePool addObject:child]; xmlAddChild(self->_node, child->_node); } @end External/TouchXML/Source/Creation/CXMLNode_CreationExtensions.h000066400000000000000000000054041250533726500247500ustar00rootroot00000000000000// // CXMLNode_CreationExtensions.h // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode.h" @class CXMLElement; @interface CXMLNode (CXMLNode_CreationExtensions) //- (id)initWithKind:(NSXMLNodeKind)kind; //- (id)initWithKind:(NSXMLNodeKind)kind options:(NSUInteger)options; //primitive + (id)document; + (id)documentWithRootElement:(CXMLElement *)element; + (id)elementWithName:(NSString *)name; + (id)elementWithName:(NSString *)name URI:(NSString *)URI; + (id)elementWithName:(NSString *)name stringValue:(NSString *)string; //+ (id)elementWithName:(NSString *)name children:(NSArray *)children attributes:(NSArray *)attributes; //+ (id)attributeWithName:(NSString *)name stringValue:(NSString *)stringValue; //+ (id)attributeWithName:(NSString *)name URI:(NSString *)URI stringValue:(NSString *)stringValue; + (id)namespaceWithName:(NSString *)name stringValue:(NSString *)stringValue; + (id)processingInstructionWithName:(NSString *)name stringValue:(NSString *)stringValue; //+ (id)commentWithStringValue:(NSString *)stringValue; //+ (id)textWithStringValue:(NSString *)stringValue; //+ (id)DTDNodeWithXMLString:(NSString *)string; - (void)setStringValue:(NSString *)inStringValue; @end External/TouchXML/Source/Creation/CXMLNode_CreationExtensions.m000066400000000000000000000104411250533726500247520ustar00rootroot00000000000000// // CXMLNode_CreationExtensions.m // TouchCode // // Created by Jonathan Wight on 04/01/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLNode_CreationExtensions.h" #import "CXMLDocument.h" #import "CXMLElement.h" #import "CXMLNode_PrivateExtensions.h" #import "CXMLDocument_PrivateExtensions.h" #import "CXMLNamespaceNode.h" @implementation CXMLNode (CXMLNode_CreationExtensions) + (id)document; { xmlDocPtr theDocumentNode = xmlNewDoc((const xmlChar *)"1.0"); NSAssert(theDocumentNode != NULL, @"xmlNewDoc failed"); CXMLDocument *theDocument = [[CXMLDocument alloc] initWithLibXMLNode:(xmlNodePtr)theDocumentNode freeOnDealloc:NO]; return(theDocument); } + (id)documentWithRootElement:(CXMLElement *)element; { xmlDocPtr theDocumentNode = xmlNewDoc((const xmlChar *)"1.0"); NSAssert(theDocumentNode != NULL, @"xmlNewDoc failed"); xmlDocSetRootElement(theDocumentNode, element.node); CXMLDocument *theDocument = [[CXMLDocument alloc] initWithLibXMLNode:(xmlNodePtr)theDocumentNode freeOnDealloc:NO]; [theDocument.nodePool addObject:element]; return(theDocument); } + (id)elementWithName:(NSString *)name { xmlNodePtr theElementNode = xmlNewNode(NULL, (const xmlChar *)[name UTF8String]); CXMLElement *theElement = [[CXMLElement alloc] initWithLibXMLNode:(xmlNodePtr)theElementNode freeOnDealloc:NO]; return(theElement); } + (id)elementWithName:(NSString *)name URI:(NSString *)URI { xmlNodePtr theElementNode = xmlNewNode(NULL, (const xmlChar *)[name UTF8String]); xmlNsPtr theNSNode = xmlNewNs(theElementNode, (const xmlChar *)[URI UTF8String], NULL); theElementNode->ns = theNSNode; CXMLElement *theElement = [[CXMLElement alloc] initWithLibXMLNode:(xmlNodePtr)theElementNode freeOnDealloc:NO]; return(theElement); } + (id)elementWithName:(NSString *)name stringValue:(NSString *)string { xmlNodePtr theElementNode = xmlNewNode(NULL, (const xmlChar *)[name UTF8String]); CXMLElement *theElement = [[CXMLElement alloc] initWithLibXMLNode:(xmlNodePtr)theElementNode freeOnDealloc:NO]; theElement.stringValue = string; return(theElement); } + (id)namespaceWithName:(NSString *)name stringValue:(NSString *)stringValue { return [[CXMLNamespaceNode alloc] initWithPrefix:name URI:stringValue parentElement:nil]; } + (id)processingInstructionWithName:(NSString *)name stringValue:(NSString *)stringValue; { xmlNodePtr theNode = xmlNewPI((const xmlChar *)[name UTF8String], (const xmlChar *)[stringValue UTF8String]); NSAssert(theNode != NULL, @"xmlNewPI failed"); CXMLNode *theNodeObject = [[CXMLNode alloc] initWithLibXMLNode:theNode freeOnDealloc:NO]; return(theNodeObject); } - (void)setStringValue:(NSString *)inStringValue { NSAssert(_node->type == XML_TEXT_NODE, @"CNode setStringValue only implemented for text nodes"); xmlNodeSetContent(_node, (const xmlChar *)[inStringValue UTF8String]); } @end External/TouchXML/Source/Tidy/000077500000000000000000000000001250533726500164645ustar00rootroot00000000000000External/TouchXML/Source/Tidy/CTidy.h000066400000000000000000000045221250533726500176540ustar00rootroot00000000000000// // CTidy.h // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #ifdef TOUCHXMLUSETIDY #import #include "tidy.h" #include "buffio.h" typedef enum { TidyFormat_HTML, TidyFormat_XML, TidyFormat_XHTML, } CTidyFormat; @interface CTidy : NSObject { } + (CTidy *)tidy; - (NSData *)tidyData:(NSData *)inData inputFormat:(CTidyFormat)inInputFormat outputFormat:(CTidyFormat)inOutputFormat encoding:(const char *)encoding diagnostics:(NSString **)outDiagnostics error:(NSError **)outError; - (NSString *)tidyString:(NSString *)inString inputFormat:(CTidyFormat)inInputFormat outputFormat:(CTidyFormat)inOutputFormat encoding:(const char *)encoding diagnostics:(NSString **)outDiagnostics error:(NSError **)outError; @end #endif /* TOUCHXMLUSETIDY */ External/TouchXML/Source/Tidy/CTidy.m000066400000000000000000000203131250533726500176550ustar00rootroot00000000000000// // CTidy.m // TouchCode // // Created by Jonathan Wight on 03/07/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #ifdef TOUCHXMLUSETIDY #import "CTidy.h" @interface CTidy () @end #pragma mark - @implementation CTidy + (CTidy *)tidy { return([[[self alloc] init] autorelease]); } - (NSData *)tidyData:(NSData *)inData inputFormat:(CTidyFormat)inInputFormat outputFormat:(CTidyFormat)inOutputFormat encoding:(const char*)encoding diagnostics:(NSString **)outDiagnostics error:(NSError **)outError { TidyDoc theTidyDocument = tidyCreate(); int theResultCode = 0; // Set input format if input is XML (xhtml & html are the tidy 'default') if (inInputFormat == TidyFormat_XML) { theResultCode = tidyOptSetBool(theTidyDocument, TidyXmlTags, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); } // Set output format TidyOptionId theOutputValue = TidyXmlOut; if (inOutputFormat == TidyFormat_HTML) theOutputValue = TidyHtmlOut; else if (inOutputFormat == TidyFormat_XHTML) theOutputValue = TidyXhtmlOut; theResultCode = tidyOptSetBool(theTidyDocument, theOutputValue, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); // Force output even if errors found theResultCode = tidyOptSetBool(theTidyDocument, TidyForceOutput, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); // Set encoding - same for input and output theResultCode = tidySetInCharEncoding(theTidyDocument, encoding) NSAssert(theResultCode >= 0, @"tidySetInCharEncoding() should return 0"); theResultCode = tidySetOutCharEncoding(theTidyDocument, encoding); NSAssert(theResultCode >= 0, @"tidySetOutCharEncoding() should return 0"); // Create an error buffer TidyBuffer theErrorBuffer; tidyBufInit(&theErrorBuffer); theResultCode = tidySetErrorBuffer(theTidyDocument, &theErrorBuffer); NSAssert(theResultCode >= 0, @"tidySetErrorBuffer() should return 0"); // ############################################################################# // Create an input buffer and copy input to it (TODO uses 2X memory == bad!) TidyBuffer theInputBuffer; tidyBufAlloc(&theInputBuffer, [inData length]); memcpy(theInputBuffer.bp, [inData bytes], [inData length]); theInputBuffer.size = [inData length]; // Parse the data. theResultCode = tidyParseBuffer(theTidyDocument, &theInputBuffer); if (theResultCode < 0) { if (outError) { NSDictionary *theUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithUTF8String:(char *)theErrorBuffer.bp], NSLocalizedDescriptionKey, NULL]; *outError = [NSError errorWithDomain:@"TODO_DOMAIN" code:theResultCode userInfo:theUserInfo]; } return(NO); } // Clean up input buffer. tidyBufFree(&theInputBuffer); // Repair the data theResultCode = tidyCleanAndRepair(theTidyDocument); if (theResultCode < 0) { return(NULL); } //theResultCode = tidyRunDiagnostics(theTidyDocument); // TidyBuffer theOutputBuffer; tidyBufInit(&theOutputBuffer); theResultCode = tidySaveBuffer(theTidyDocument, &theOutputBuffer); if (theResultCode < 0) return(NULL); NSAssert(theOutputBuffer.bp != NULL, @"The buffer should not be null."); NSData *theOutput = [NSData dataWithBytes:theOutputBuffer.bp length:theOutputBuffer.size]; tidyBufFree(&theOutputBuffer); // if (outDiagnostics && theErrorBuffer.bp != NULL) { NSData *theErrorData = [NSData dataWithBytes:theErrorBuffer.bp length:theErrorBuffer.size]; *outDiagnostics = [[[NSString alloc] initWithData:theErrorData encoding:NSUTF8StringEncoding] autorelease]; } tidyBufFree(&theErrorBuffer); // ############################################################################# tidyRelease(theTidyDocument); return(theOutput); } - (NSString *)tidyString:(NSString *)inString inputFormat:(CTidyFormat)inInputFormat outputFormat:(CTidyFormat)inOutputFormat encoding:(const char*)encoding diagnostics:(NSString **)outDiagnostics error:(NSError **)outError { TidyDoc theTidyDocument = tidyCreate(); int theResultCode = 0; // Set input format if input is XML (xhtml & html are the tidy 'default') if (inInputFormat == TidyFormat_XML) { theResultCode = tidyOptSetBool(theTidyDocument, TidyXmlTags, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); } // Set output format TidyOptionId theOutputValue = TidyXmlOut; if (inOutputFormat == TidyFormat_HTML) theOutputValue = TidyHtmlOut; else if (inOutputFormat == TidyFormat_XHTML) theOutputValue = TidyXhtmlOut; theResultCode = tidyOptSetBool(theTidyDocument, theOutputValue, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); // Force output even if errors found theResultCode = tidyOptSetBool(theTidyDocument, TidyForceOutput, YES); NSAssert(theResultCode >= 0, @"tidyOptSetBool() should return 0"); // Set encoding - same for input and output theResultCode = tidySetInCharEncoding(theTidyDocument, encoding) NSAssert(theResultCode >= 0, @"tidySetInCharEncoding() should return 0"); theResultCode = tidySetOutCharEncoding(theTidyDocument, encoding); NSAssert(theResultCode >= 0, @"tidySetOutCharEncoding() should return 0"); // Create an error buffer TidyBuffer theErrorBuffer; tidyBufInit(&theErrorBuffer); theResultCode = tidySetErrorBuffer(theTidyDocument, &theErrorBuffer); NSAssert(theResultCode >= 0, @"tidySetErrorBuffer() should return 0"); // ############################################################################# // Parse the data. theResultCode = tidyParseString(theTidyDocument, [inString UTF8String]); if (theResultCode < 0) { if (outError) { NSDictionary *theUserInfo = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithUTF8String:(char *)theErrorBuffer.bp], NSLocalizedDescriptionKey, NULL]; *outError = [NSError errorWithDomain:@"TODO_DOMAIN" code:theResultCode userInfo:theUserInfo]; } return(NO); } // Repair the data theResultCode = tidyCleanAndRepair(theTidyDocument); if (theResultCode < 0) { return(NULL); } //theResultCode = tidyRunDiagnostics(theTidyDocument); // uint theBufferLength = 0; theResultCode = tidySaveString(theTidyDocument, NULL, &theBufferLength); NSMutableData *theOutputBuffer = [NSMutableData dataWithLength:theBufferLength]; theResultCode = tidySaveString(theTidyDocument, [theOutputBuffer mutableBytes], &theBufferLength); NSString *theString = [[[NSString alloc] initWithData:theOutputBuffer encoding:NSUTF8StringEncoding] autorelease]; // if (outDiagnostics && theErrorBuffer.bp != NULL) { NSData *theErrorData = [NSData dataWithBytes:theErrorBuffer.bp length:theErrorBuffer.size]; *outDiagnostics = [[[NSString alloc] initWithData:theErrorData encoding:NSUTF8StringEncoding] autorelease]; } tidyBufFree(&theErrorBuffer); // ############################################################################# tidyRelease(theTidyDocument); return(theString); } @end #endif /* TOUCHXMLUSETIDY */ External/TouchXML/Source/TouchXML.h000066400000000000000000000036431250533726500173750ustar00rootroot00000000000000// // TouchXML.h // TouchCode // // Created by Jonathan Wight on 07/11/08. // Copyright 2011 toxicsoftware.com. All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY TOXICSOFTWARE.COM ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TOXICSOFTWARE.COM OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and documentation are those of the // authors and should not be interpreted as representing official policies, either expressed // or implied, of toxicsoftware.com. #import "CXMLDocument.h" #import "CXMLDocument_CreationExtensions.h" #import "CXMLElement.h" #import "CXMLElement_CreationExtensions.h" #import "CXMLElement_ElementTreeExtensions.h" #import "CXMLNode.h" #import "CXMLNode_CreationExtensions.h" #import "CXMLNode_XPathExtensions.h" Headers/000077500000000000000000000000001250533726500124415ustar00rootroot00000000000000Headers/Internal/000077500000000000000000000000001250533726500142155ustar00rootroot00000000000000Headers/Internal/MLMovieInfoGrabber.h000066400000000000000000000037751250533726500200130ustar00rootroot00000000000000/***************************************************************************** * MLMovieInfoGrabber.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @protocol MLMovieInfoGrabberDelegate; @interface MLMovieInfoGrabber : NSObject { NSURLConnection *_connection; NSMutableData *_data; NSArray *_results; id __weak _delegate; #if HAVE_BLOCK void (^_block)(NSError *); #else id _userData; #endif } @property (readwrite, weak) id delegate; #if !HAVE_BLOCK @property (readwrite, strong) id userData; #endif @property (readonly, strong) NSArray *results; - (void)lookUpForTitle:(NSString *)title; #if HAVE_BLOCK - (void)lookUpForTitle:(NSString *)title andExecuteBlock:(void (^)(NSError *))block; #endif @end @protocol MLMovieInfoGrabberDelegate @optional - (void)movieInfoGrabber:(MLMovieInfoGrabber *)grabber didFailWithError:(NSError *)error; - (void)movieInfoGrabberDidFinishGrabbing:(MLMovieInfoGrabber *)grabber; @end Headers/Internal/MLTVShowEpisodesInfoGrabber.h000066400000000000000000000042331250533726500216100ustar00rootroot00000000000000/***************************************************************************** * MLTVShowEpisodesInfoGrabber.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @class MLURLConnection; @protocol MLTVShowEpisodesInfoGrabberDelegate; @interface MLTVShowEpisodesInfoGrabber : NSObject { MLURLConnection *_connection; NSDictionary *_results; NSArray *_episodesResults; id __weak _delegate; void (^_block)(); #if !HAVE_BLOCK id _userData; #endif } @property (readwrite, weak) id delegate; @property (readonly, strong) NSArray *episodesResults; @property (readonly, strong) NSDictionary *results; #if !HAVE_BLOCK @property (readwrite, strong) id userData; #endif - (void)lookUpForShowID:(NSString *)id; #if HAVE_BLOCK - (void)lookUpForShowID:(NSString *)id andExecuteBlock:(void (^)())block; #endif @end @protocol MLTVShowEpisodesInfoGrabberDelegate @optional - (void)tvShowEpisodesInfoGrabber:(MLTVShowEpisodesInfoGrabber *)grabber didFailWithError:(NSError *)error; - (void)tvShowEpisodesInfoGrabberDidFinishGrabbing:(MLTVShowEpisodesInfoGrabber *)grabber; @end Headers/Internal/MLTVShowInfoGrabber.h000066400000000000000000000047211250533726500201160ustar00rootroot00000000000000/***************************************************************************** * MLTVShowInfoGrabber.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @protocol MLTVShowInfoGrabberDelegate; @interface MLTVShowInfoGrabber : NSObject { NSURLConnection *_connection; NSMutableData *_data; NSArray *_results; void (^_block)(); id __weak _delegate; #if !HAVE_BLOCK id _userData; #endif } @property (readwrite, weak) id delegate; @property (readonly, strong) NSArray *results; #if !HAVE_BLOCK @property (readwrite, strong) id userData; #endif - (void)lookUpForTitle:(NSString *)title; #if HAVE_BLOCK - (void)lookUpForTitle:(NSString *)title andExecuteBlock:(void (^)())block; #endif #if HAVE_BLOCK + (void)fetchServerTimeAndExecuteBlock:(void (^)(NSNumber *))block; + (void)fetchUpdatesSinceServerTime:(NSNumber *)serverTime andExecuteBlock:(void (^)(NSArray *))block; #else - (void)fetchUpdatesSinceServerTime:(NSNumber *)serverTime; - (void)fetchServerTime; + (NSNumber *)serverTime; #endif @end @protocol MLTVShowInfoGrabberDelegate @required - (void)tvShowInfoGrabber:(MLTVShowInfoGrabber *)grabber didFailWithError:(NSError *)error; - (void)tvShowInfoGrabberDidFinishGrabbing:(MLTVShowInfoGrabber *)grabber; - (void)tvShowInfoGrabberDidFetchServerTime:(MLTVShowInfoGrabber *)grabber; - (void)tvShowInfoGrabber:(MLTVShowInfoGrabber *)grabber didFetchUpdates:(NSArray *)updates; @end Headers/Internal/MLTitleDecrapifier.h000066400000000000000000000026741250533726500200470ustar00rootroot00000000000000/***************************************************************************** * MLTitleDecrapifier.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLFile.h" @interface MLTitleDecrapifier : NSObject + (NSString *)decrapify:(NSString *)string; + (BOOL)isTVShowEpisodeTitle:(NSString *)string; + (NSDictionary *)tvShowEpisodeInfoFromString:(NSString *)string; + (NSDictionary *)audioContentInfoFromFile:(MLFile *)file; @end Headers/Internal/MLURLConnection.h000066400000000000000000000042451250533726500173060ustar00rootroot00000000000000/***************************************************************************** * MLURLConnection.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @protocol MLURLConnectionDelegate; @class MLURLConnection; @interface MLURLConnection : NSObject { NSMutableData *_data; NSURLConnection *_connection; id _delegate; id _userObject; #if HAVE_BLOCK void (^_block)(MLURLConnection *connection, NSError *error); #endif } @property (readonly, strong) NSData *data; @property (readwrite, strong) id userObject; @property (readwrite, strong) id delegate; #if HAVE_BLOCK + (id)runConnectionWithURL:(NSURL *)url andBlock:(void (^)(MLURLConnection *connection, NSError *error))block; - (void)loadURL:(NSURL *)url andPerformBlock:(void (^)(MLURLConnection *connection, NSError *error))block; #else + (id)runConnectionWithURL:(NSURL *)url delegate:(id)delegate userObject:(id)userObject; - (void)loadURL:(NSURL *)url; #endif - (void)cancel; @end @protocol MLURLConnectionDelegate - (void)urlConnection:(MLURLConnection *)connection didFinishWithError:(NSError *)error; @end Headers/Internal/NSXMLNode_Additions.h000066400000000000000000000024761250533726500201040ustar00rootroot00000000000000/***************************************************************************** * CXMLNode_Additions.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @interface NSXMLNode (MLAdditions) - (NSString *)stringValueForXPath:(NSString *)string; - (NSNumber *)numberValueForXPath:(NSString *)string; @end Headers/Internal/TheTVDBGrabber.h000066400000000000000000000036121250533726500170550ustar00rootroot00000000000000/***************************************************************************** * TheTVDBGrabber.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #define TVDB_DEFAULT_LANGUAGE "en" #define TVDB_HOSTNAME "thetvdb.com" #define TVDB_IMAGES_HOSTNAME "thetvdb.com" #define TVDB_API_KEY "EACB874D8C2A90E2" /* See http://thetvdb.com/wiki/index.php?title=Programmers_API */ #define TVDB_QUERY_SEARCH @"http://%s/api/GetSeries.php?seriesname=%@" #define TVDB_QUERY_SEARCH_NEW @"http://%s/api/GetSeriesNew.php?seriesname=%@" #define TVDB_QUERY_SERVER_TIME @"http://%s/api/Updates.php?type=none" #define TVDB_QUERY_UPDATES @"http://%s/api/Updates.php?type=all&time=%@" #define TVDB_QUERY_INFO @"http://%s/api/%s/series/%@/%s.xml" #define TVDB_QUERY_EPISODE_INFO @"http://%s/api/%s/series/%@/all/%s.xml" #define TVDB_COVERS_URL @"http://%s/banners/%@" Headers/Public/000077500000000000000000000000001250533726500136575ustar00rootroot00000000000000Headers/Public/MLAlbum.h000066400000000000000000000036131250533726500153240ustar00rootroot00000000000000/***************************************************************************** * MLAlbum.h ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul Kühne * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @class MLAlbumTrack; @interface MLAlbum : NSManagedObject + (NSArray *)allAlbums; + (MLAlbum *)albumWithName:(NSString *)name; @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *releaseYear; @property (nonatomic, strong) NSSet *tracks; @property (nonatomic, strong, readonly) NSSet *unreadTracks; @property (weak, nonatomic, readonly) NSArray *sortedTracks; - (void)removeTrack:(MLAlbumTrack *)track; - (void)removeTrackWithNumber:(NSNumber *)trackNumber; @end @interface MLAlbum (CoreDataGeneratedAccessors) - (void)addTracksObject:(NSManagedObject *)value; - (void)removeTracksObject:(NSManagedObject *)value; - (void)addTracks:(NSSet *)value; - (void)removeTracks:(NSSet *)value; @end Headers/Public/MLAlbumTrack.h000066400000000000000000000041371250533726500163130ustar00rootroot00000000000000/***************************************************************************** * MLAlbumTrack.h ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul Kühne * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLAlbum.h" @interface MLAlbumTrack : NSManagedObject + (NSArray *)allTracks; + (MLAlbumTrack *)trackWithAlbum:(id)album trackNumber:(NSNumber *)trackNumber createIfNeeded:(BOOL)createIfNeeded; + (MLAlbumTrack *)trackWithAlbumName:(NSString *)albumName trackNumber:(NSNumber *)trackNumber createIfNeeded:(BOOL)createIfNeeded wasCreated:(BOOL *)wasCreated; @property (nonatomic, strong) NSNumber *unread; @property (nonatomic, strong) NSString *artist; @property (nonatomic, strong) NSString *genre; @property (nonatomic, strong) NSString *title; @property (nonatomic, strong) NSNumber *trackNumber; @property (nonatomic, strong) MLAlbum *album; @property (nonatomic, strong) NSSet *files; @end @interface MLAlbumTrack (CoreDataGeneratedAccessors) - (void)addFilesObject:(NSManagedObject *)value; - (void)removeFilesObject:(NSManagedObject *)value; - (void)addFiles:(NSSet *)value; - (void)removeFiles:(NSSet *)value; @end Headers/Public/MLFile.h000066400000000000000000000104221250533726500151370ustar00rootroot00000000000000/***************************************************************************** * MLFile.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class MLShowEpisode; @class MLAlbumTrack; extern NSString *kMLFileTypeMovie; extern NSString *kMLFileTypeClip; extern NSString *kMLFileTypeTVShowEpisode; extern NSString *kMLFileTypeAudio; @interface MLFile : NSManagedObject + (NSArray *)allFiles; + (NSArray *)fileForURL:(NSString *)url; - (BOOL)isKindOfType:(NSString *)type; - (BOOL)isMovie; - (BOOL)isClip; - (BOOL)isShowEpisode; - (BOOL)isAlbumTrack; - (BOOL)isSupportedAudioFile; @property (nonatomic, strong) NSNumber *seasonNumber; @property (nonatomic, strong) NSNumber *remainingTime; @property (nonatomic, strong) NSString *releaseYear; @property (nonatomic, strong) NSNumber *lastPosition; @property (nonatomic, strong) NSNumber *lastSubtitleTrack; @property (nonatomic, strong) NSNumber *lastAudioTrack; @property (nonatomic, strong) NSNumber *playCount; @property (nonatomic, strong) NSString *artworkURL; @property (nonatomic, strong) NSString *url; @property (nonatomic, strong) NSString *type; @property (nonatomic, strong) NSString *title; @property (nonatomic, strong) NSString *shortSummary; @property (nonatomic, strong) NSNumber *currentlyWatching; @property (nonatomic, strong) NSNumber *episodeNumber; @property (nonatomic, strong) NSNumber *unread; @property (nonatomic, strong) NSNumber *hasFetchedInfo; @property (nonatomic, strong) NSNumber *noOnlineMetaData; @property (nonatomic, strong) MLShowEpisode *showEpisode; @property (nonatomic, strong) NSSet *labels; @property (nonatomic, strong) NSSet *tracks; @property (nonatomic, strong) NSNumber *isOnDisk; @property (nonatomic, strong) NSNumber *duration; @property (nonatomic, strong) NSString *artist; @property (nonatomic, strong) NSString *album; @property (nonatomic, strong) NSNumber *albumTrackNumber; @property (nonatomic, strong) NSNumber *folderTrackNumber; @property (nonatomic, strong) NSString *genre; @property (nonatomic, strong) MLAlbumTrack *albumTrack; @property (nonatomic, strong) UIImage *computedThumbnail; @property (nonatomic, assign) BOOL isSafe; @property (nonatomic, assign) BOOL isBeingParsed; @property (nonatomic, assign) BOOL thumbnailTimeouted; /** * the data in this object are about to be put on screen * * If multiple MLFile object are processed, this * increase the priority of the processing for this MLFile. */ - (void)willDisplay; /** * We don't display the data of this object on screen. * * This put back the eventually increased priority for this MLFile, * to a default one. * \see willDisplay */ - (void)didHide; /** * do not rely on this path unless you are a MLKit object */ - (NSString *)thumbnailPath; /** * Shortcuts to the videoTracks. */ - (NSManagedObject *)videoTrack; - (size_t)fileSizeInBytes; @end @interface MLFile (CoreDataGeneratedAccessors) - (void)addLabelsObject:(NSManagedObject *)value; - (void)removeLabelsObject:(NSManagedObject *)value; - (void)addLabels:(NSSet *)value; - (void)removeLabels:(NSSet *)value; - (void)addTracksObject:(NSManagedObject *)value; - (void)removeTracksObject:(NSManagedObject *)value; - (void)addTracks:(NSSet *)value; - (void)removeTracks:(NSSet *)value; @end Headers/Public/MLLabel.h000066400000000000000000000032131250533726500152770ustar00rootroot00000000000000/***************************************************************************** * MLLabel.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class MLFile; @interface MLLabel : NSManagedObject + (NSArray *)allLabels; - (NSArray *)sortedFolderItems; @property (nonatomic, strong) NSString * name; @property (nonatomic, strong) NSSet* files; @end @interface MLLabel (CoreDataGeneratedAccessors) - (void)addFilesObject:(MLFile *)value; - (void)removeFilesObject:(MLFile *)value; - (void)addFiles:(NSSet *)value; - (void)removeFiles:(NSSet *)value; @end Headers/Public/MLMediaLibrary.h000066400000000000000000000040451250533726500166300ustar00rootroot00000000000000/***************************************************************************** * MLMediaLibrary.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @interface MLMediaLibrary : NSObject @property (readonly) BOOL libraryNeedsUpgrade; @property (nonatomic, strong) id delegate; @property (nonatomic, strong) NSURL *persistentStoreURL; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; + (id)sharedMediaLibrary; - (void)addFilePaths:(NSArray *)filepaths; - (void)upgradeLibrary; - (void)updateMediaDatabase; // May be internal - (NSFetchRequest *)fetchRequestForEntity:(NSString *)entity; - (id)createObjectForEntity:(NSString *)entity; - (void)removeObject:(NSManagedObject *)object; - (NSString *)thumbnailFolderPath; - (NSString *)documentFolderPath; - (void)applicationWillStart; - (void)applicationWillExit; - (void)save; - (void)libraryDidDisappear; - (void)libraryDidAppear; @end @protocol MLMediaLibrary @optional - (void)libraryUpgradeComplete; @endHeaders/Public/MLShow.h000066400000000000000000000043201250533726500152000ustar00rootroot00000000000000/***************************************************************************** * MLShow.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class MLShowEpisode; @interface MLShow : NSManagedObject + (NSArray *)allShows; + (MLShow *)showWithName:(NSString *)name; @property (nonatomic, strong) NSString *theTVDBID; @property (nonatomic, strong) NSString *shortSummary; @property (nonatomic, strong) NSString *artworkURL; @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *releaseYear; @property (nonatomic, strong) NSNumber *lastSyncDate; @property (nonatomic, strong) NSSet *episodes; @property (weak, nonatomic, readonly) NSArray *sortedEpisodes; @property (nonatomic, strong, readonly) NSSet *unreadEpisodes; - (void)addEpisode:(MLShowEpisode*)episode; - (void)removeEpisode:(MLShowEpisode*)episode; - (void)removeEpisodeWithSeasonNumber:(NSNumber *)seasonNumber andEpisodeNumber:(NSNumber *)episodeNumber; @end @interface MLShow (CoreDataGeneratedAccessors) - (void)addEpisodesObject:(NSManagedObject *)value; - (void)removeEpisodesObject:(NSManagedObject *)value; - (void)addEpisodes:(NSSet *)value; - (void)removeEpisodes:(NSSet *)value; @end Headers/Public/MLShowEpisode.h000066400000000000000000000047421250533726500165210ustar00rootroot00000000000000/***************************************************************************** * MLShowEpisode.h * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class MLShow; @interface MLShowEpisode : NSManagedObject + (NSArray *)allEpisodes; // This will eventually create the show + (MLShowEpisode *)episodeWithShow:(MLShow *)show episodeNumber:(NSNumber *)episodeNumber seasonNumber:(NSNumber *)seasonNumber createIfNeeded:(BOOL)createIfNeeded; + (MLShowEpisode *)episodeWithShowName:(NSString *)showName episodeNumber:(NSNumber *)episodeNumber seasonNumber:(NSNumber *)seasonNumber createIfNeeded:(BOOL)createIfNeeded wasCreated:(BOOL *)wasCreated; @property (nonatomic, strong) NSNumber *unread; @property (nonatomic, strong) NSString *theTVDBID; @property (nonatomic, strong) NSString *shortSummary; @property (nonatomic, strong) NSNumber *shouldBeDisplayed; @property (nonatomic, strong) NSNumber *episodeNumber; @property (nonatomic, strong) NSNumber *seasonNumber; @property (nonatomic, strong) NSNumber *lastSyncDate; @property (nonatomic, strong) NSString *artworkURL; @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) MLShow *show; @property (nonatomic, strong) NSSet *files; @end @interface MLShowEpisode (CoreDataGeneratedAccessors) - (void)addFilesObject:(NSManagedObject *)value; - (void)removeFilesObject:(NSManagedObject *)value; - (void)addFiles:(NSSet *)value; - (void)removeFiles:(NSSet *)value; @end Headers/Public/MediaLibraryKit.h000066400000000000000000000027271250533726500170540ustar00rootroot00000000000000/***************************************************************************** * MediaLibraryKit ***************************************************************************** * Copyright (C) 2013 Felix Paul Kühne * * Authors: Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #import #import #import #import #import @class MLFile; @class MLLabel; @class MLMediaLibrary; @class MLShow; @class MLShowEpisode; @class MLAlbum; @class MLAlbumTrack; MediaLibrary.xcdatamodeld/000077500000000000000000000000001250533726500160625ustar00rootroot00000000000000MediaLibrary.xcdatamodeld/.xccurrentversion000066400000000000000000000004151250533726500215060ustar00rootroot00000000000000 _XCCurrentVersionName MediaLibrary-2.5.xcdatamodel MediaLibrary.xcdatamodeld/MediaLibrary-2.1.xcdatamodel/000077500000000000000000000000001250533726500232105ustar00rootroot00000000000000MediaLibrary.xcdatamodeld/MediaLibrary-2.1.xcdatamodel/elements000066400000000000000000007657431250533726500247750ustar00rootroot00000000000000bplist00]]X$versionX$objectsY$archiverT$topf456NOPQRSTUVWrstz{q  $39:BQR[uvwxyz{|}~'6EQcdefghijyz+:IM\kz.';JYhwz      !"#$%:;COcr *9STZfz#/CRapt *9H]^fr   / > M \ k z  ' 6 : I X g v  # $ , 8 L [ j y }   " 1 @ O d e m y  ' 6 E T c r s -<KWix />BQ`o~*+3?Sbq )8GVklt.=L[jkz%4CR^p&5DHWfu /08DXgv.=L[pqy!3BQ`o~ )8GVbt*9HL[jy45=I]l{$3BQ`uv~ &8GHWfu  />M\hz !0?NRap%:;COcr  * 9 H W f { | !!! !,!>!M!N!]!l!{!!!!!!!!!""""&"5"D"S"b"n""""""""""###'#6#E#T#X#g#v#########$$$$*$>$M$P$_$n$}$$$$$$$$$$$$$$%%%#%2%A%E%T%c%r%%%%%%%%%&&&,&-&5&A&U&d&s&&&&&&&&&&' ''+':'I'X'm'n'v'''''''''((((0(?(N(](l({((((((((())))&)5)D)S)_)q))))))))))***'*6*E*I*X*g*v********++ +++/+>+A+P+_+n+q++++++++++++++++,,,#,2,6,E,T,c,r,,,,,,,,,----&-2-F-U-d-s-w---------. ..+.:.I.^._.g.s.........///!/0/?/N/]/l/{///////////000%040@0F0G0V0_0`0a0e0m0p000000000011 11*191H1W1c1u111111111122#2$2,282L2[2j2y2}22222222333"313@3O3d3e3m3y3333333334 44'464E4T4c4r44444444444555,5;5J5V5h5w5555555555666-6<6@6O6^6m6|66666666777'7(707<7P7_7n7}777777777888&858D8S8h8i8q8}8888888889 99+9:9I9X9g99999999999: :::#:2:3:;:<:=:R:S:[:g:{:::::::::;;;$;3;B;Q;`;o;~;;;;;;;;;;< <<)<8=M=P=_=n=t=u=v=============> >>>,>;>J>Y>e>w>>>>>>>>>>? ??-?UMUQU`UoU~UUUUUUUUVVV#V8V9VAVMVaVpVVVVVVVVVVW WW(W7WFWUWdWyWzWWWWWWWWWXXXX*X\M\\\k\z\\\\\\\\\]]]]%]4]C]R]^]p]]]]]]]]]]]]]]]U$null __xd_rootPackageV$class\_xd_comments__xd_modelManager__configurationsByName]_xd_modelName__modelVersionIdentifierebcd_MediaLibrary.xcdatamodel !"#$%&'()&,-./0&&_XDBucketForClasseswasEncoded_XDBucketForPackagesstorage_XDBucketForInterfacesstorage__xd_owningModel_XDBucketForPackageswasEncodedV_owner_XDBucketForDataTypesstorage[_visibility_XDBucketForClassesstorageU_name_XDBucketForInterfaceswasEncoded_XDBucketForDataTypeswasEncoded__uniqueElementID`^_aPSYES78 9CMWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLF.р,[ShowEpisodeUAlbumTShowTFile_TrackInformation_AudioTrackInformationZAlbumTrack_VideoTrackInformationULabelXYZ[\] ^_ "`a%bcd&&hi.&cl:copq_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage[_isAbstract4]BoWordered78 uwMvx,^XD_PStereotype"| %} b~Dvc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 M!"#&(-1,_XDPMCompoundIndexes_XD_PSK_elementID_XD_PSK_versionHashModifier_XD_PSK_fetchRequestsArray_XD_PSK_isAbstract_XD_PSK_userInfo_XD_PSK_classMapping_XD_PSK_entityClassName "%xqqq.qqqqU_typeX_default\_association[_isReadOnlyY_isStaticY_isUniqueZ_isDerivedZ_isOrdered\_isCompositeW_isLeaf Z$classnameX$classes_XDUMLPropertyImp_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImpXNSObject "%xqqq.qqqq  "%xqqq.qqqq  "%xqqq.qqqq$ 8 %^NSMutableArrayWNSArray "%xqqq.qqqq'  "% xqqq.qqqq) 78 M*+,_ com.apple.syncservices.DataClass_MediaLibraryFile!"_NSMutableDictionary!#\NSDictionary "%&xqqq.qqqq. " %b 45q./0_XDGenericRecordClass;<]XDUMLClassImp=>?@A]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp "%Dxqqq.qqqq2 ]MLShowEpisodeST_XDUMLStereotypeImpUVWXYZ_XDUMLStereotypeImp]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp78 \hM]^_`abcdefg56789:;<=>?ijklmnopqrs@lց2/F,VunreadUfiles\shortSummary_shouldBeDisplayed]episodeNumber\seasonNumberTshowZartworkURL\lastSyncDateTnameYtheTVDBID  "%&Dqq.qcq]qqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedBk5AI78 MCDEY,_XD_PPropStereotype_XD_PAtt_Stereotype" % bic&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage@C3F78 MGHIJKLMNOPQSTVWX,_XD_PPSK_isStoredInTruthFile_XD_PPSK_versionHashModifier_XD_PPSK_userInfo_XD_PPSK_isIndexed_XD_PPSK_isOptional_XD_PPSK_isSpotlightIndexed_XD_PPSK_elementID_XD_PPSK_isTransient "%qqq.qqqq'E G "%qqq.qqqqE H "%qqq.qqqqRE I78 M, "%qqq.qqqq'E J "% qqq.qqqqUE K  "%qqq.qqqq'E L "%qqq.qqqqE M "%qqq.qqqq'E N"F %G bHic&.qP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage@D3Z78 RZMSTUVWXY[\]^_`a[\]^_`abdefhij,_XD_PAttK_defaultValueAsString_(XD_PAttK_allowsExternalBinaryDataStorage_XD_PAttK_minValueString_XD_PAttK_attributeType_XD_PAttK_maxValueString_XD_PAttK_valueTransformerName_ XD_PAttK_regularExpressionString "%lqqq.qSqqqcY [RNO "%qqq.qTqqq'Y \ "%qqq.qUqqqY ] "%qqq.qVqqqgY ^  "%qqq.qWqqqY _ "%qqq.qXqqqY ` "%qqq.qYqqqY a]XDPMAttribute]XDPMAttribute\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImp  "%&Dqq.qcq^qqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedn6mB"78 MCop{,_XD_PR_Stereotype" % bjc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragelC3q78  MGHIJKLMNrstvwxyz, "%qqq.qqqq'p G "%qqq.qqqqp H "%<qqq.qqqqup I78 JKM, "% qqq.qqqqUp J "% qqq.qqqqUp K "%qqq.qqqq'p L "%qqq.qqqqp M "%qqq.qqqq'p N" % bjc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragelo3|78 M}~ӁԁՀ,_XD_PRK_minCount_XD_PRK_deleteRule_XD_PRK_maxCount_XD_PRK_destination_XD_PRK_isToMany^XD_PRK_ordered_XD_PRK_inverseRelationship "%qqq.qqqq{ } "%qqq.qqqq{ ~ "%qqq.qqqq{  "%Gqqq.qqqq{   "%bc&& i.&cl=cq_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage Ҁ 78 Mv," % bGvc&.q&_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 (1M23456789, "%qqq.qqqq  "%qqq.qqqq  "%qqq.qqqq  "%jqqq.qqqq 8 x% "%qqq.qqqq'  "%qqq.qqqq 78 M+,_com.apple.syncservices.Syncable_ com.apple.syncservices.DataClassRNO "%&qqq.qqqq.  "%qqq.qqqq VMLFile78 M ]〞5 3Jbz؁4Lc{ف2I`wv,Vlabels\lastPositionUtitleSurl]episodeNumberXduration_noOnlineMetaData_lastParsingDate^hasFetchedInfo^lastAudioTrack\shortSummary\seasonNumber_lastSubtitleTrack[releaseYearZartworkURLTtype_thumbnailTimeoutedYplayCount_currentlyWatchingXisOnDiskZalbumTrack]remainingTime_albumTrackNumberVartist_folderTrackNumber[showEpisodeVtracksUgenreUalbum]isBeingParsedVisSafe&' ( "%&Gqq0.qcqqq8q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedu78 <?MCo@Aˀ,"D %E bFc&.qN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 PYMGHIJKLMNZ[\]^_`a€ÀĀƀǀȀɀʀ, "%@qqq.qqqq' G "%@qqq.qqqq H "%@qqq.qqqqŀ I78 M, "% @qqq.qqqqU J "% @qqq.qqqqU K "%@qqq.qqqq' L "%@qqq.qqqq M "%@qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo378 M}~̀΀πЁ, "%Aqqq.qqqq } "%Aqqq.qqqq ~ "%Aqqq.qqqq  "%LAqqq.qqqqр :;<=>? @A "BC%bcE&&Ii.&clBcPQq_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorageӁiJ78 UWMvXԀ,"[ %\ b]Lvc&.qe_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageр378 gpMqrstuvwxր׀؀ـۀ܀߀, "%Xqqq.qqqq  "%Xqqq.qqqq  "%Xqqq.qqqq  "%Xqqq.qqqqڀ 8 % "%Xqqq.qqqq'  "%Xqqq.qqqq݀ 78 Mـޡ+,_ com.apple.syncservices.DataClass "%&Xqqq.qqqq.  "%Xqqq.qqqq WMLLabel78 Mf^>6,  "%&Lqq.qcqfqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk>ḁ78 MCD !,"$ %% b&c&.q._!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 09MGHIJKLMN:;<=>?@A, "% qqq.qqqq' G "% qqq.qqqq H "%c qqq.qqqq I78 qrM, "% qqq.qqqq' J "% qqq.qqqq' K "% qqq.qqqq' L "% qqq.qqqq M "% qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 MSTUVWXY[\]^_`aۀ, "%!qqq.qSqqq [XUntitled "%!qqq.qTqqq' \ "%!qqq.qUqqq ] "% !qqq.qVqqq ^ "%!qqq.qWqqq _ "%!qqq.qXqqq ` "%!qqq.qYqqq aIJ K "%&LqqS.qcq^qq[q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered6iJQ78 _bMCocd ,"g %h bic&.qq_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 s|MGHIJKLMN}~ , "%cqqq.qqqq' G "%cqqq.qqqq H "%cqqq.qqqq I78 M, "% cqqq.qqqqU J "%cqqq.qqqq' K "%cqqq.qqqq' L "%cqqq.qqqq M "%cqqq.qqqq' N"  %  b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo3 78  M}~         , "%dqqq.qqqq  } "%dqqq.qqqq  ~ "%dqqq.qqqq   "%Gdqqq.qqqq   "% dqqq.qqqqU   "%dqqq.qqqq'   "%dqqq.qqqq   _XDPMRelationship _XDPMRelationship\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImpZduplicates8 % ZXDPMEntity ZXDPMEntity]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp "% Aqqq.qqqqU  "%Aqqq.qqqq'  "%Aqqq.qqqq   "%&Gqq .qcqqq q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk78 MCD (," % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 MGHIJKLMN        !#$%&', "% qqq.qqqq' G "% qqq.qqqq H "% ) qqq.qqqq" I78 7 8M, "% qqq.qqqq' J "%  qqq.qqqqU K "% qqq.qqqq' L "% qqq.qqqq M "% qqq.qqqq' N" % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3)78 MSTUVWXY[\]^_`a *,-.012, "%  qqq.qSqqq+( [Q0 "% qqq.qTqqq'( \ "% qqq.qUqqq( ] "%  qqq.qVqqq/( ^ "% qqq.qWqqq( _ "% qqq.qXqqq( ` "% qqq.qYqqq( a    "%&Gqq .qcqqq !q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered5k41,78 % (MCD ) *6A," - % . b /c&.q 7_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage3C3778 9 BMGHIJKLMN C D E F G H I J89:<=>?@, "% )qqq.qqqq'6 G "% )qqq.qqqq6 H "% l )qqq.qqqq;6 I78 z {M, "% )qqq.qqqq'6 J "%  )qqq.qqqqU6 K "% )qqq.qqqq'6 L "% )qqq.qqqq6 M "% )qqq.qqqq'6 N" % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage3D3B78 MSTUVWXY[\]^_`a CDEFGHI, "% *qqq.qSqqqA [ "% *qqq.qTqqq'A \ "% *qqq.qUqqqA ] "%  *qqq.qVqqqA ^ "% *qqq.qWqqqA _ "% *qqq.qXqqqA ` "% *qqq.qYqqqA a P Q R "%&Gqq Z.qcqqq bq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedLkK{fK78 f iMCD j kMX," n % o b pc&.q x_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageJC3N78 z MGHIJKLMN OPQSTUVW, "% jqqq.qqqq'M G "% jqqq.qqqqM H "%  jqqq.qqqqRM I78 M, "% jqqq.qqqq'M J "% jqqq.qqqq'M K "% jqqq.qqqq'M L "% jqqq.qqqqM M "% jqqq.qqqq'M N" % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageJD3Y78  MSTUVWXY[\]^_`a  ! " # $ %Z[\]^`a, "% kqqq.qSqqqX [ "% kqqq.qTqqq'X \ "% kqqq.qUqqqX ] "%  kqqq.qVqqqX ^ "% e kqqq.qWqqq_X _T1024 "% kqqq.qXqqqX ` "% kqqq.qYqqqX a  "%&Gqq .qcqqq q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordereddkcA$78 MCD ep," % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragebC3f78 MGHIJKLMN ́ghiklmno, "% qqq.qqqq'e G "% qqq.qqqqe H "%  qqq.qqqqje I78 M, "% qqq.qqqq'e J "%  qqq.qqqqUe K "% qqq.qqqq'e L "% qqq.qqqqe M "% qqq.qqqq'e N"L %M bNc&.qV_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragebD3q78 X`MSTUVWXY[\]^_`aabcdefgrstuwxy, "%  qqq.qSqqq+p [ "% qqq.qTqqq'p \ "% qqq.qUqqqp ] "% qqq.qVqqqvp ^d "% qqq.qWqqqp _ "% qqq.qXqqqp ` "% qqq.qYqqqp a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered|k{#78 MCD}," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragezC3~78 MGHIJKLMN     , "%qqq.qqqq'} G "%qqq.qqqq} H "%1qqq.qqqq} I78 ?@M, "%qqq.qqqq'} J "% qqq.qqqqU} K "%qqq.qqqq'} L "%qqq.qqqq} M "%qqq.qqqq'} N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragezD378 MSTUVWXY[\]^_`a, "%qqq.qSqqq [ "%qqq.qTqqq' \ "%qqq.qUqqq ] "%qqq.qVqqq ^, "%qqq.qWqqq _ "%qqq.qXqqq ` "%qqq.qYqqq a  "%&Gqq .qcqqq(q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedksW78 ,/MCD01,"4 %5 b6c&.q>_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 @IMGHIJKLMNJKLMNOPQ, "%0qqq.qqqq' G "%0qqq.qqqq H "%s0qqq.qqqq I78 M, "%0qqq.qqqq' J "% 0qqq.qqqqU K "%0qqq.qqqq' L "%0qqq.qqqq M "%0qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 MSTUVWXY[\]^_`a, "%l1qqq.qSqqqc [ "%1qqq.qTqqq' \ "%1qqq.qUqqq ] "%1qqq.qVqqqg ^ "%1qqq.qWqqq _ "%1qqq.qXqqq ` "%1qqq.qYqqq aWX Y "%&Gqqa.qcqqqiq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk H78 mpMCDqr,"u %v bwc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 MGHIJKLMN, "%qqqq.qqqq' G "%qqqq.qqqq H "%qqqq.qqqq I78 M, "%qqqq.qqqq' J "% qqqq.qqqqU K "%qqqq.qqqq' L "%qqqq.qqqq M "%qqqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 %MSTUVWXY[\]^_`a&'()*+,, "%rqqq.qSqqq [ "%rqqq.qTqqq' \ "%rqqq.qUqqq ] "%]rqqq.qVqqq ^ "%rqqq.qWqqq _ "%rqqq.qXqqq ` "%rqqq.qYqqq a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkm#78 MCDāπ," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 MGHIJKLMNԁƁǁȁʁˁ́́΀, "%qqq.qqqq' G "%qqq.qqqq H "%qqq.qqqqɀ I78 M, "% qqq.qqqqU J "% qqq.qqqqU K "%qqq.qqqq' L "%qqq.qqqq M "%qqq.qqqq' N"S %T bUc&.q]_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 _gMSTUVWXY[\]^_`ahijklmnсҁӁԁՁց׀, "%lqqq.qSqqqc [ "%qqq.qTqqq' \ "%qqq.qUqqq ] "%qqq.qVqqqg ^ "%qqq.qWqqq _ "%qqq.qXqqq ` "%qqq.qYqqq a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkq78 MCDہ," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage؀C378  MGHIJKLMN݁ށ߁, "%qqq.qqqq' G "%qqq.qqqq H "%7qqq.qqqq I78 EFM, "%qqq.qqqq' J "% qqq.qqqqU K "%qqq.qqqq' L "%qqq.qqqq M "%qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage؀D378 MSTUVWXY[\]^_`a, "% qqq.qSqqq+ [ "%qqq.qTqqq' \ "%qqq.qUqqq ] "%qqq.qVqqqv ^ "%qqq.qWqqq _ "%qqq.qXqqq ` "%qqq.qYqqq a  "%&Gqq%.qcqqq-q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk ޘ78 14MCD56,"9 %: b;c&.qC_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 ENMGHIJKLMNOPQRSTUV, "%5qqq.qqqq' G "%5qqq.qqqq H "%x5qqq.qqqq I78 M, "%5qqq.qqqq' J "% 5qqq.qqqqU K "%5qqq.qqqq' L "%5qqq.qqqq M "%5qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 MSTUVWXY[\]^_`a, "%6qqq.qSqqq [ "%6qqq.qTqqq' \ "%6qqq.qUqqq ] "% 6qqq.qVqqq ^ "%6qqq.qWqqq _ "%6qqq.qXqqq ` "%6qqq.qYqqq a\] ^ "%&Gqqf.qcqqqnq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkeY78 ruMCDvw ,"z %{ b|c&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC3 78 MGHIJKLMN   , "%vqqq.qqqq'  G "%vqqq.qqqq  H "%vqqq.qqqq  I78 M, "%vqqq.qqqq'  J "% vqqq.qqqqU  K "%vqqq.qqqq'  L "%vqqq.qqqq  M "%vqqq.qqqq'  N" % bc&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 "*MSTUVWXY[\]^_`a+,-./01, "% wqqq.qSqqq+ [ "%wqqq.qTqqq' \ "%wqqq.qUqqq ] "%wqqq.qVqqqv ^ "%wqqq.qWqqq _ "%wqqq.qXqqq ` "%wqqq.qYqqq a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkY78 MCD +," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC3!78 MGHIJKLMN؁"#$&'()*, "%qqq.qqqq'  G "%qqq.qqqq  H "%qqq.qqqq%  I78  M, "%qqq.qqqq'  J "% qqq.qqqqU  K "%qqq.qqqq'  L "%qqq.qqqq  M "%qqq.qqqq'  N"W %X bYc&.qa_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3,78 ckMSTUVWXY[\]^_`almnopqr-./0123, "% qqq.qSqqq++ [ "%qqq.qTqqq'+ \ "%qqq.qUqqq+ ] "%qqq.qVqqqv+ ^ "%qqq.qWqqq+ _ "%qqq.qXqqq+ ` "%qqq.qYqqq+ a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered6k57V<78 MCD7B," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4C3878 MGHIJKLMN9:;=>?@A, "%qqq.qqqq'7 G "%qqq.qqqq7 H "%;qqq.qqqq<7 I78 IJM, "%qqq.qqqq'7 J "% qqq.qqqqU7 K "%qqq.qqqq'7 L "%qqq.qqqq7 M "%qqq.qqqq'7 N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4D3C78 MSTUVWXY[\]^_`aDEFGHJK, "%qqq.qSqqqB [ "%qqq.qTqqq'B \ "%qqq.qUqqqB ] "% qqq.qVqqqB ^ "%qqq.qWqqqIB _Q4 "%qqq.qXqqqB ` "%qqq.qYqqqB a ! " "%&Gqq*.qcqqq2q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedNkMQ)78 69MCD:;OZ,"> %? b@c&.qH_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageLC3P78 JSMGHIJKLMNTUVWXYZ[QRSUVWXY, "%:qqq.qqqq'O G "%:qqq.qqqqO H "%}:qqq.qqqqTO I78 M, "%:qqq.qqqq'O J "% :qqq.qqqqUO K "%:qqq.qqqq'O L "%:qqq.qqqqO M "%:qqq.qqqq'O N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageLD3[78 MSTUVWXY[\]^_`a\]^_`ab, "% ;qqq.qSqqq+Z [ "%;qqq.qTqqq'Z \ "%;qqq.qUqqqZ ] "%;qqq.qVqqqvZ ^ "%;qqq.qWqqqZ _ "%;qqq.qXqqqZ ` "%;qqq.qYqqqZ aab c "%&Gqqk.qcqqqsq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedekd ]}78 wzMCD{|fq," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragecC3g78 MGHIJKLMNhijlmnop, "%{qqq.qqqq'f G "%{qqq.qqqqf H "%{qqq.qqqqkf I78 M, "%{qqq.qqqq'f J "% {qqq.qqqqUf K "%{qqq.qqqq'f L "%{qqq.qqqqf M "%{qqq.qqqq'f N" % bc&.q%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragecD3r78 '/MSTUVWXY[\]^_`a0123456suvwxyz, "%:|qqq.qSqqqtq [Umovie "%|qqq.qTqqq'q \ "%|qqq.qUqqqq ] "% |qqq.qVqqqq ^ "%|qqq.qWqqqq _ "%|qqq.qXqqqq ` "%|qqq.qYqqqq a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered}k|'78 MCD~," % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage{C378 MGHIJKLMNށ, "%qqq.qqqq'~ G "%qqq.qqqq~ H "%qqq.qqqq~ I78 M, "%qqq.qqqq'~ J "% qqq.qqqqU~ K "%qqq.qqqq'~ L "%qqq.qqqq~ M "%qqq.qqqq'~ N"] %^ b_c&.qg_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage{D378 iqMSTUVWXY[\]^_`arstuvwx, "%lqqq.qSqqqc [ "%qqq.qTqqq' \ "%qqq.qUqqq ] "%qqq.qVqqqg ^ "%qqq.qWqqq _ "%qqq.qXqqq ` "%qqq.qYqqq a  "%&Gqq.qcqqqq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkV|M78 MCD," % bc&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 MGHIJKLMN, "%qqq.qqqq' G "%qqq.qqqq H "%Aqqq.qqqq I78 OPM, "%qqq.qqqq' J "% qqq.qqqqU K "%qqq.qqqq' L "%qqq.qqqq M "%qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 MSTUVWXY[\]^_`a, "% qqq.qSqqq+ [ "%qqq.qTqqq' \ "%qqq.qUqqq ] "%qqq.qVqqq ^ "%qqq.qWqqq _ "%qqq.qXqqq ` "%qqq.qYqqq a&' ( "%&Gqq0.qcqqq8q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk78 <?MCD@A,"D %E bFc&.qN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 PYMGHIJKLMNZ[\]^_`a, "%@qqq.qqqq' G "%@qqq.qqqq H "%@qqq.qqqq I78 M, "%@qqq.qqqq' J "% @qqq.qqqqU K "%@qqq.qqqq' L "%@qqq.qqqq M "%@qqq.qqqq' N" % bc&.q_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 MSTUVWXY[\]^_`a, "%lAqqq.qSqqqc [ "%Aqqq.qTqqq' \ "%Aqqq.qUqqq ] "%Aqqq.qVqqqg ^ "%Aqqq.qWqqq _ "%Aqqq.qXqqq ` "%Aqqq.qYqqq a g h i "%&Gqq q.qcqqq yq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedku78 } MCD āπ," % b c&.q _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 MGHIJKLMN Ɓǁȁʁˁ́́΀, "% qqq.qqqq' G "% qqq.qqqq H "%  qqq.qqqqɀ I78 M, "% qqq.qqqq' J "%  qqq.qqqqU K "% qqq.qqqq' L "% qqq.qqqq M "% qqq.qqqq' N"!! %!" b!#c&.q!+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 !-!5MSTUVWXY[\]^_`a!6!7!8!9!:!;!<сӁԁՁցׁ؀, "%!@ qqq.qSqqqҀ [SYES "% qqq.qTqqq' \ "% qqq.qUqqq ] "% qqq.qVqqqg ^ "% qqq.qWqqq _ "% qqq.qXqqq ` "% qqq.qYqqq a!! ! "%&Gqq!.qcq]qq!q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk5q78 !!MCD!!ā܁,"! %! b!c&.q!_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـC378 !!MGHIJKLMN!!!!!!!!ށ߁, "%!qqq.qqqq' G "%!qqq.qqqq H "%"!qqq.qqqq I78 ""M, "% !qqq.qqqqU J "% !qqq.qqqqU K "%!qqq.qqqq' L "%!qqq.qqqq M "%!qqq.qqqq' N""c %"d b"ec&.q"m_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـD378 "o"wMSTUVWXY[\]^_`a"x"y"z"{"|"}"~, "%!@!qqq.qSqqqҀ [ "%!qqq.qTqqq' \ "%!qqq.qUqqq ] "%!qqq.qVqqqg ^ "%!qqq.qWqqq _ "%!qqq.qXqqq ` "%!qqq.qYqqq a"" " "%&Gqq".qcqqq"q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered?78 ##MCo##,"# %# b# c&.q#_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 ##MGHIJKLMN### #!#"###$#%, "%#qqq.qqqq' G "%#qqq.qqqq H "%#G#qqq.qqqq I78 #U#VM, "% #qqq.qqqqU J "% #qqq.qqqqU K "%#qqq.qqqq' L "%#qqq.qqqq M "%#qqq.qqqq' N"# %# b#c&.q#_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo378 ##M}~#######, "%#qqq.qqqq } "%#qqq.qqqq ~ "%#qqq.qqqq  "%J#qqq.qqqq ##$$$$ $$ "$$%bc$ &&$ i.&cl@c$$q_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage M78 $$Mv$,"$ %$ b$!Jvc&.q$)_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 $+$4M$5$6$7$8$9$:$;$<    , "%$@$qqq.qqqq  8 $N% "%$qqq.qqqq  "%$qqq.qqqq  "%$p$qqq.qqqq 8 $~% "%$qqq.qqqq'  "%$$qqq.qqqq 78 $$M$$,_ com.apple.syncservices.DataClass_MediaLibraryFile "%&$qqq.qqqq.  "%$$qqq.qqqq \MLAlbumTrack78 $$M$^6$$$$$$Ӂ0G^u,[trackNumber$$ $ "%&Jqq$.qcq$qq$q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk{9|78 $$MCD$$',"$ %$ b$$c&.q$_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 %% MGHIJKLMN% % % %%%%% "#$%&, "%$qqq.qqqq' G "%$qqq.qqqq H "%%4$qqq.qqqq! I78 %B%CM, "%$qqq.qqqq' J "% $qqq.qqqqU K "%$qqq.qqqq' L "%$qqq.qqqq M "%$qqq.qqqq' N"% %% b%$c&.q%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3(78 %%MSTUVWXY[\]^_`a%%%%%%%)*+,-./, "% $qqq.qSqqq+' [ "%$qqq.qTqqq'' \ "%$qqq.qUqqq' ] "%$qqq.qVqqqv' ^ "%$qqq.qWqqq' _ "%$qqq.qXqqq' ` "%$qqq.qYqqq' a&& & "%&Jqq&".qcqqq&*q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered2k1578 &.&1MCD&2&33>,"&6 %&7 b&8$c&.q&@_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage0C3478 &B&KMGHIJKLMN&L&M&N&O&P&Q&R&S5679:;<=, "%&2qqq.qqqq'3 G "%&2qqq.qqqq3 H "%&u&2qqq.qqqq83 I78 &&M, "%&2qqq.qqqq'3 J "% &2qqq.qqqqU3 K "%&2qqq.qqqq'3 L "%&2qqq.qqqq3 M "%&2qqq.qqqq'3 N"& %& b&$c&.q&_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage0D3?78 &&MSTUVWXY[\]^_`a&&&&&&&@ABCDEF, "%&3qqq.qSqqq> [ "%&3qqq.qTqqq'> \ "%&3qqq.qUqqq> ] "% &3qqq.qVqqq> ^ "%&3qqq.qWqqq> _ "%&3qqq.qXqqq> ` "%&3qqq.qYqqq> a'Y'Z '[ "%&Jqq'c.qcqqq'kq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedIkHr~78 'o'rMCD's'tJU,"'w %'x b'y$c&.q'_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageGC3K78 ''MGHIJKLMN''''''''LMNPQRST, "%'sqqq.qqqq'J G "%'sqqq.qqqqJ H "%''sqqq.qqqqOJ I78 ''M, "%'sqqq.qqqq'J J "% 'sqqq.qqqqUJ K "%'sqqq.qqqq'J L "%'sqqq.qqqqJ M "%'sqqq.qqqq'J N"( %( b($c&.q(_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageGD3V78 (('MSTUVWXY[\]^_`a((()(*(+(,(-(.WXYZ[\], "%'tqqq.qSqqqU [ "%'tqqq.qTqqq'U \ "%'tqqq.qUqqqU ] "% 'tqqq.qVqqqU ^ "%'tqqq.qWqqqU _ "%'tqqq.qXqqqU ` "%'tqqq.qYqqqU a(( ( "%&Jqq(.qcq^qq(q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered`6__78 ((MCo((al,"( %( b($c&.q(_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage^C3b78 ((MGHIJKLMN((((((((Ձcdeghijk, "%(qqq.qqqq'a G "%(qqq.qqqqa H "%((qqq.qqqqfa I78 ))M, "% (qqq.qqqqUa J "% (qqq.qqqqUa K "%(qqq.qqqq'a L "%(qqq.qqqqa M "%(qqq.qqqq'a N")T %)U b)V$c&.q)^_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage^o3m78 )`)hM}~)i)j)k)l)m)n)onopqrst, "%(qqq.qqqql } "%(qqq.qqqql ~ "%(qqq.qqqql  "%G(qqq.qqqql  "% (qqq.qqqqUl  "%(qqq.qqqq'l  "%(qqq.qqqql )) ) "%&Jqq).qcqqq)q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedwv78 ))MCo))x,") %) b)$c&.q*_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageuC3y78 **MGHIJKLMN********z{|~, "%)qqq.qqqq'x G "%)qqq.qqqqx H "%*8)qqq.qqqq}x I78 *F*GM, "% )qqq.qqqqUx J "% )qqq.qqqqUx K "%)qqq.qqqq'x L "%)qqq.qqqqx M "%)qqq.qqqq'x N"* %* b*$c&.q*_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageuo378 **M}~*******, "%)qqq.qqqq } "%)qqq.qqqq ~ "%)qqq.qqqq  "%E)qqq.qqqq ****** ** "**%bc*&&*i.&cl;c++q_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorages78 + + Mv+ ,"+ %+ b+Evc&.q+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 ++%M+&+'+(+)+*+++,+-, "%+1+ qqq.qqqq 8 +?% "%+ qqq.qqqq  "%+ qqq.qqqq  "%+a+ qqq.qqqq 8 +o% "%+ qqq.qqqq'  "%++ qqq.qqqq 78 ++M+++,_com.apple.syncservices.Syncable_ com.apple.syncservices.DataClass_MediaLibraryFile "%&+ qqq.qqqq.  "%++ qqq.qqqq WMLAlbum78 ++M+f+>++++Á΁,[releaseYear\unreadTracks++ + "%&Eqq+.qcqqq+q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered*f78 ++MCo++,"+ %+ b++c&.q+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 ++MGHIJKLMN++++,,,,, "%+qqq.qqqq' G "%+qqq.qqqq H "%,%+qqq.qqqq I78 ,3,4M, "% +qqq.qqqqU J "% +qqq.qqqqU K "%+qqq.qqqq' L "%+qqq.qqqq M "%+qqq.qqqq' N", %, b,+c&.q,_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo378 ,,M}~,,,,,,,, "%+qqq.qqqq } "%+qqq.qqqq ~ "%+qqq.qqqq  "%J+qqq.qqqq  "% +qqq.qqqqU  "%+qqq.qqqq'  "%$+qqq.qqqqu - - - "%&Eqq-.qcq+qq-q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk<78 --"MCD-#-$ŀ,"-' %-( b-)+c&.q-1_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 -3-<MGHIJKLMN-=->-?-@-A-B-C-DÁĀ, "%-#qqq.qqqq' G "%-#qqq.qqqq H "%-f-#qqq.qqqq I78 -t-uM, "%-#qqq.qqqq' J "% -#qqq.qqqqU K "%-#qqq.qqqq' L "%-#qqq.qqqq M "%-#qqq.qqqq' N"- %- b-+c&.q-_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 --MSTUVWXY[\]^_`a-------ށǁȁɁʁˁ́̀, "%-$qqq.qSqqq [ "%-$qqq.qTqqq' \ "%-$qqq.qUqqq ] "% -$qqq.qVqqq ^ "%-$qqq.qWqqq _ "%-$qqq.qXqqq ` "%-$qqq.qYqqq a.J.K .L "%&Eqq.T.qcqfqq.\q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk>O"N78 .`.cMCD.d.eс܀,".h %.i b.j+c&.q.r_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage΀C378 .t.}MGHIJKLMN.~.......ӁԁՁׁ؁فځۀ, "%.dqqq.qqqq' G "%.dqqq.qqqq H "%..dqqq.qqqqր I78 ..M, "% .dqqq.qqqqU J "%.dqqq.qqqq' K "%.dqqq.qqqq' L "%.dqqq.qqqq M "%.dqqq.qqqq' N"/ %/ b/+c&.q/_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage΀D378 //MSTUVWXY[\]^_`a///////ށ߁, "%.eqqq.qSqqq [ "%.eqqq.qTqqq' \ "%.eqqq.qUqqq ] "% .eqqq.qVqqq ^ "%.eqqq.qWqqq _ "%.eqqq.qXqqq ` "%.eqqq.qYqqq a// / "%&Eqq/.qcq/+qq/q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk78 //M/C//,_XD_PFP_Stereotype"/ %/ b/+c&.q/_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 //MGHIJLMN///////Ł, "%/qqq.qqqq' G "%/qqq.qqqq H "%//qqq.qqqq I78 //M, "%/qqq.qqqq' J "%/qqq.qqqq' L "%/qqq.qqqq M "% /qqq.qqqqU N"05 %06 b07+/c&.q0?_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 0A0CM0B0D,_XD_PFP_fetchRequestKey "%0I/qqq.q0Bqqq "0W0X0Y 0Z+0\E0^__fetchedProperty__predicateStringW_entity_fetchedPropertyFetchRequest_&album == $FETCH_SOURCE AND unread == 10b0c_XDPMFetchRequest0d_XDPMFetchRequest0f0g_XDPMFetchedProperty0h0i0j0k0l_XDPMFetchedProperty\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImp8 0n% "%)qqq.qqqq'  "%)qqq.qqqq'  "%+)qqq.qqqq 00 0 "%&Jqq0.qcqqq0q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk>R78 00MCD00,"0 %0 b0$c&.q0_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 00MGHIJKLMN00000000ف     , "%0qqq.qqqq' G "%0qqq.qqqq H "%00qqq.qqqq I78 1 1 M, "%0qqq.qqqq' J "% 0qqq.qqqqU K "%0qqq.qqqq' L "%0qqq.qqqq M "%0qqq.qqqq' N"1X %1Y b1Z$c&.q1b_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 1d1lMSTUVWXY[\]^_`a1m1n1o1p1q1r1s, "%0qqq.qSqqq [ "%0qqq.qTqqq' \ "%0qqq.qUqqq ] "% 0qqq.qVqqq ^ "%0qqq.qWqqq _ "%0qqq.qXqqq ` "%0qqq.qYqqq a8 1% "%#qqq.qqqq'  "%#qqq.qqqq'  "%$#qqq.qqqq^ 22 2 "%&Gqq2.qcqqq2!q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk)l78 2%2(MCD2)2*),"2- %2. b2/c&.q27_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 292BMGHIJKLMN2C2D2E2F2G2H2I2J !"$%&'(, "%2)qqq.qqqq' G "%2)qqq.qqqq H "%2l2)qqq.qqqq# I78 2z2{M, "%2)qqq.qqqq' J "% 2)qqq.qqqqU K "%2)qqq.qqqq' L "%2)qqq.qqqq M "%2)qqq.qqqq' N"2 %2 b2c&.q2_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3*78 22MSTUVWXY[\]^_`a2222222+,-./01, "% 2*qqq.qSqqq+) [ "%2*qqq.qTqqq') \ "%2*qqq.qUqqq) ] "%2*qqq.qVqqq) ^ "%2*qqq.qWqqq) _ "%2*qqq.qXqqq) ` "%2*qqq.qYqqq) a3P3Q 3R "%&Gqq3Z.qcqqq3bq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered4k3>78 3f3iMCD3j3k5@,"3n %3o b3pc&.q3x_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2C3678 3z3MGHIJKLMN33333333789;<=>?, "%3jqqq.qqqq'5 G "%3jqqq.qqqq5 H "%33jqqq.qqqq:5 I78 33M, "%3jqqq.qqqq'5 J "% 3jqqq.qqqqU5 K "%3jqqq.qqqq'5 L "%3jqqq.qqqq5 M "%3jqqq.qqqq'5 N"4 %4 b4 c&.q4_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2D3A78 44MSTUVWXY[\]^_`a44 4!4"4#4$4%BCDEFGH, "% 3kqqq.qSqqq+@ [ "%3kqqq.qTqqq'@ \ "%3kqqq.qUqqq@ ] "%3kqqq.qVqqqv@ ^ "%3kqqq.qWqqq@ _ "%3kqqq.qXqqq@ ` "%3kqqq.qYqqq@ a44 4 "%&Gqq4.qcqqq4q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedKkJUN\A78 44MCD44LW,"4 %4 b4c&.q4_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageIC3M78 44MGHIJKLMN44444444́NOPRSTUV, "%4qqq.qqqq'L G "%4qqq.qqqqL H "%44qqq.qqqqQL I78 44M, "%4qqq.qqqq'L J "% 4qqq.qqqqUL K "%4qqq.qqqq'L L "%4qqq.qqqqL M "%4qqq.qqqq'L N"5K %5L b5Mc&.q5U_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageID3X78 5W5_MSTUVWXY[\]^_`a5`5a5b5c5d5e5fYZ[\]^_, "%4qqq.qSqqqW [ "%4qqq.qTqqq'W \ "%4qqq.qUqqqW ] "% 4qqq.qVqqqW ^ "%4qqq.qWqqqW _ "%4qqq.qXqqqW ` "%4qqq.qYqqqW a55 5 "%&Gqq5.qcqqq5q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedbkaI~\ 78 55MCD55cn,"5 %5 b5c&.q5_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage`C3d78 56MGHIJKLMN6666 6 6 6 6 efgijklm, "%5qqq.qqqq'c G "%5qqq.qqqqc H "%6/5qqq.qqqqhc I78 6=6>M, "%5qqq.qqqq'c J "% 5qqq.qqqqUc K "%5qqq.qqqq'c L "%5qqq.qqqqc M "%5qqq.qqqq'c N"6 %6 b6c&.q6_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage`D3o78 66MSTUVWXY[\]^_`a6666666pqrstuv, "% 5qqq.qSqqq+n [ "%5qqq.qTqqq'n \ "%5qqq.qUqqqn ] "%5qqq.qVqqqvn ^ "%5qqq.qWqqqn _ "%5qqq.qXqqqn ` "%5qqq.qYqqqn a77 7 "%&Gqq7.qcqqq7%q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedyxA78 7)7,MCo7-7.z,"71 %72 b73c&.q7;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragewC3{78 7=7FMGHIJKLMN7G7H7I7J7K7L7M7N|}~, "%7-qqq.qqqq'z G "%7-qqq.qqqqz H "%7p7-qqq.qqqqz I78 7~7M, "% 7-qqq.qqqqUz J "% 7-qqq.qqqqUz K "%7-qqq.qqqq'z L "%7-qqq.qqqqz M "%7-qqq.qqqq'z N"7 %7 b7c&.q7_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragewo378 77M}~7777777, "%7.qqq.qqqq } "%7.qqq.qqqq ~ "%7.qqq.qqqq  "%D7.qqq.qqqq  "%7.qqq.qqqq'  "%7.qqq.qqqq'  "%j7.qqq.qqqql 8T8U 8V "%&Gqq8^.qcqqq8fq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered78 8j8mMCo8n8o,"8r %8s b8tc&.q8|_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 8~8MGHIJKLMN88888888, "%8nqqq.qqqq' G "%8nqqq.qqqq H "%88nqqq.qqqq I78 88M, "% 8nqqq.qqqqU J "% 8nqqq.qqqqU K "%8nqqq.qqqq' L "%8nqqq.qqqq M "%8nqqq.qqqq' N"9 %9 b9c&.q9_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo378 99"M}~9#9$9%9&9'9(9)stu, "%8oqqq.qqqq } "%8oqqq.qqqq ~ "%8oqqq.qqqq  "%H8oqqq.qqqq b9h9i9j9k9l9m 9n"9o%9p9q9r9s9t9u cc9y&icl&>99&&c99i._!XDBucketForOwnedAttributesordered_!XDBucketForSpecializationsordered_XDBucketForStereotypesstorage_$XDBucketForOwnedAttributeswasEncoded_$XDBucketForGeneralizationsduplicates_XDBucketForStereotypesordered_$XDBucketForGeneralizationswasEncoded_!XDBucketForGeneralizationsstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForSpecializationswasEncoded_!XDBucketForGeneralizationsordered_!XDBucketForOwnedAttributesstorage_!XDBucketForSpecializationsstorage_$XDBucketForSpecializationsduplicates  78 99Mv9,"9 %9 b9Hvc&.q9_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage378 99M99999999, "%9qqq.qqqq  "%9qqq.qqqq  "%9qqq.qqqq  "%99qqq.qqqq 8 9% "% 9qqq.qqqqU  "%:9qqq.qqqq 78 ::M:+,_ com.apple.syncservices.DataClass "%&9qqq.qqqq.  "%:%9qqq.qqqq _NSManagedObject78 :4:7M:5:6:8:9̀,UcodecTfile:>:? :@ "%&Hqq:H.qcq:5qq:Pq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkV78 :T:WMCD:X:YĀ,":\ %:] b:^:8c&.q:f_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 :h:qMGHIJKLMN:r:s:t:u:v:w:x:yÀ, "%:Xqqq.qqqq' G "%:Xqqq.qqqq H "%::Xqqq.qqqq I78 ::M, "%:Xqqq.qqqq' J "% :Xqqq.qqqqU K "%:Xqqq.qqqq' L "%:Xqqq.qqqq M "%:Xqqq.qqqq' N": %: b::8c&.q;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 ;; MSTUVWXY[\]^_`a; ;;;;;;ƁǁȁɁʁˁ̀, "%:Yqqq.qSqqq [ "%:Yqqq.qTqqq' \ "%:Yqqq.qUqqq ] "% :Yqqq.qVqqq ^ "%:Yqqq.qWqqq _ "%:Yqqq.qXqqq ` "%:Yqqq.qYqqq a;; ; "%&Hqq;.qcq:6qq;q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedR 78 ;;MCo;;Ёۀ,"; %; b;:9c&.q;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragèC378 ;;MGHIJKLMN;;;;;;;;ҁӁԁցׁ؁فڀ, "%;qqq.qqqq' G "%;qqq.qqqq H "%;;qqq.qqqqՀ I78 ;;M, "% ;qqq.qqqqU J "% ;qqq.qqqqU K "%;qqq.qqqq' L "%;qqq.qqqq M "%;qqq.qqqq' N"<9 %<: b<;:9c&.q > M, "%=qqq.qqqq' J "% =qqq.qqqqU K "%=qqq.qqqq' L "%=qqq.qqqq M "%=qqq.qqqq' N">Z %>[ b>\=c&.q>d_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3 78 >f>nMSTUVWXY[\]^_`a>o>p>q>r>s>t>u  , "% =qqq.qSqqq+  [ "%=qqq.qTqqq'  \ "%=qqq.qUqqq  ] "%=qqq.qVqqq  ^ "%=qqq.qWqqq  _ "%=qqq.qXqqq  ` "%=qqq.qYqqq  a>> > "%&Iqq>.qcq=qq>q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk|78 >>MCD>>!,"> %? b?=c&.q? _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 ? ?MGHIJKLMN???????? , "%>qqq.qqqq' G "%>qqq.qqqq H "%?>>qqq.qqqq I78 ?L?MM, "%>qqq.qqqq' J "% >qqq.qqqqU K "%>qqq.qqqq' L "%>qqq.qqqq M "%>qqq.qqqq' N"? %? b?=c&.q?_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3"78 ??MSTUVWXY[\]^_`a???????#$%&'(), "% >qqq.qSqqq+! [ "%>qqq.qTqqq'! \ "%>qqq.qUqqq! ] "%>qqq.qVqqq! ^ "%>qqq.qWqqq! _ "%>qqq.qXqqq! ` "%>qqq.qYqqq! a8 @"<ā%h@'@(_XDUMLGeneralizationImp@)@*@+_XDUMLGeneralizationImp_XDUMLNamedElementImp_XDUMLElementImp "<%< <KK@1H.,..r@4@5@6@7@8@9 @:@; "@<@=%bc@?&&@Ci.&clAc@J@Kq_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage@0q/78 @O@QMv@R1,"@U %@V b@WKvc&.q@__!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage.3278 @a@jM@k@l@m@n@o@p@q@r345689=>, "%@Rqqq.qqqq1  "%@Rqqq.qqqq1  "%@Rqqq.qqqq1  "%@@Rqqq.qqqq71 8 @% "%@Rqqq.qqqq'1  "%@@Rqqq.qqqq:1 78 @@M@Ӂ;@Ձ<,_ com.apple.syncservices.DataClass_MediaLibraryFile "%&@Rqqq.qqqq.1  "%@@Rqqq.qqqq?1 _NSManagedObject78 @@M@@AB@@CZ,UwidthVheightAA A "%&KqqA .qcq@qqAq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered.EkADҝ78 AAMCDAAFQ,"A! %A" bA#@c&.qA+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageCC3G78 A-A6MGHIJKLMNA7A8A9A:A;AHIJLMNOP, "%Aqqq.qqqq'F G "%Aqqq.qqqqF H "%A`Aqqq.qqqqKF I78 AnAoM, "%Aqqq.qqqq'F J "% Aqqq.qqqqUF K "%Aqqq.qqqq'F L "%Aqqq.qqqqF M "%Aqqq.qqqq'F N"A %A bA@c&.qA_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageCD3R78 AAMSTUVWXY[\]^_`aAAAAAAA؁STUVWXY, "% Aqqq.qSqqq+Q [ "%Aqqq.qTqqq'Q \ "%Aqqq.qUqqqQ ] "%Aqqq.qVqqqQ ^ "%Aqqq.qWqqqQ _ "%Aqqq.qXqqqQ ` "%Aqqq.qYqqqQ aBDBE BF "%&KqqBN.qcq@qqBVq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered.\kB[;878 BZB]MCDB^B_]h,"Bb %Bc bBd@c&.qBl_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageZC3^78 BnBwMGHIJKLMNBxByBzB{B|B}B~B_`acdefg, "%B^qqq.qqqq'] G "%B^qqq.qqqq] H "%BB^qqq.qqqqb] I78 BBM, "%B^qqq.qqqq'] J "% B^qqq.qqqqU] K "%B^qqq.qqqq'] L "%B^qqq.qqqq] M "%B^qqq.qqqq'] N"B %B bC@c&.qC_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageZD3i78 C CMSTUVWXY[\]^_`aCCCCCCCjklmnop, "% B_qqq.qSqqq+h [ "%B_qqq.qTqqq'h \ "%B_qqq.qUqqqh ] "%B_qqq.qVqqqh ^ "%B_qqq.qWqqqh _ "%B_qqq.qXqqqh ` "%B_qqq.qYqqqh a8 C<Ł-%\ "% 8oqqq.qqqqU  "%8oqqq.qqqq'  "%:98oqqq.qqqq̀ CC C "%&GqqC.qcqqqCq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedxkwjt78 CCMCDCCҁy,"C %C bCc&.qC_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragevC3z78 CCMGHIJKLMNCCCCCCCC{|}, "%Cqqq.qqqq'y G "%Cqqq.qqqqy H "%DCqqq.qqqq~y I78 D"D#M, "%Cqqq.qqqq'y J "% Cqqq.qqqqUy K "%Cqqq.qqqq'y L "%Cqqq.qqqqy M "%Cqqq.qqqq'y N"Dq %Dr bDsc&.qD{_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragevD378 D}DMSTUVWXY[\]^_`aDDDDDDD, "%Cqqq.qSqqq [ "%Cqqq.qTqqq' \ "%Cqqq.qUqqq ] "% Cqqq.qVqqq ^ "%Cqqq.qWqqq _ "%Cqqq.qXqqq ` "%Cqqq.qYqqq aDD D "%&GqqE.qcqqqE q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedkZ}r78 EEMCDEE,"E %E bEc&.qE _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 E"E+MGHIJKLMNE,E-E.E/E0E1E2E3, "%Eqqq.qqqq' G "%Eqqq.qqqq H "%EUEqqq.qqqq I78 EcEdM, "%Eqqq.qqqq' J "% Eqqq.qqqqU K "%Eqqq.qqqq' L "%Eqqq.qqqq M "%Eqqq.qqqq' N"E %E bEc&.qE_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 EEMSTUVWXY[\]^_`aEEEEEEÉ, "%Eqqq.qSqqq [ "%Eqqq.qTqqq' \ "%Eqqq.qUqqq ] "% Eqqq.qVqqq ^ "%Eqqq.qWqqq _ "%Eqqq.qXqqq ` "%Eqqq.qYqqq aF9F: F; "%&GqqFC.qcqqqFKq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk{(ݐ78 FOFRMCDFSFT,"FW %FX bFYc&.qFa_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 FcFlMGHIJKLMNFmFnFoFpFqFrFsFt, "%FSqqq.qqqq' G "%FSqqq.qqqq H "%FFSqqq.qqqq I78 FFM, "%FSqqq.qqqq' J "% FSqqq.qqqqU K "%FSqqq.qqqq' L "%FSqqq.qqqq M "%FSqqq.qqqq' N"F %F bFc&.qF_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 FGMSTUVWXY[\]^_`aGG G G G G G, "%lFTqqq.qSqqqc [ "%FTqqq.qTqqq' \ "%FTqqq.qUqqq ] "%FTqqq.qVqqqg ^ "%FTqqq.qWqqq _ "%FTqqq.qXqqq ` "%FTqqq.qYqqq aGzG{ G| "%&GqqG.qcqqqGq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedknj78 GGMCDGGɀ,"G %G bGc&.qG_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 GGMGHIJKLMNGGGGGGGGāŁƁǁȀ, "%Gqqq.qqqq' G "%Gqqq.qqqq H "%GGqqq.qqqqÀ I78 GGM, "%Gqqq.qqqq' J "% Gqqq.qqqqU K "%Gqqq.qqqq' L "%Gqqq.qqqq M "%Gqqq.qqqq' N"H4 %H5 bH6c&.qH>_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 H@HHMSTUVWXY[\]^_`aHIHJHKHLHMHNHOˁ́́΁ρЁр, "%!@Gqqq.qSqqqҀ [ "%Gqqq.qTqqq' \ "%Gqqq.qUqqq ] "%Gqqq.qVqqqg ^ "%Gqqq.qWqqq _ "%Gqqq.qXqqq ` "%Gqqq.qYqqq a8 H% "% qqq.qqqqU{  "%qqq.qqqq'{  "%qqq.qqqqw{ HH H "%&DqqH.qcq_qqHq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk7R=-78 IIMCDIIف,"I %I bI kc&.qI_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageրC378 IIMGHIJKLMNII I!I"I#I$I%I&ہ܁݁߁, "%Iqqq.qqqq' G "%Iqqq.qqqq H "%IHIqqq.qqqqހ I78 IVIWM, "%Iqqq.qqqq' J "% Iqqq.qqqqU K "%Iqqq.qqqq' L "%Iqqq.qqqq M "%Iqqq.qqqq' N"I %I bIkc&.qI_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageրD378 IIMSTUVWXY[\]^_`aIIIIIII, "%Iqqq.qSqqq [ "%Iqqq.qTqqq' \ "%Iqqq.qUqqq ] "% Iqqq.qVqqq ^ "%Iqqq.qWqqq _ "%Iqqq.qXqqq ` "%Iqqq.qYqqq aJ,J- J. "%&DqqJ6.qcq`qqJ>q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk8͑78 JBJEMCDJFJG,"JJ %JK bJLlc&.qJT_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 JVJ_MGHIJKLMNJ`JaJbJcJdJeJfJg, "%JFqqq.qqqq' G "%JFqqq.qqqq H "%JJFqqq.qqqq I78 JJM, "%JFqqq.qqqq' J "% JFqqq.qqqqU K "%JFqqq.qqqq' L "%JFqqq.qqqq M "%JFqqq.qqqq' N"J %J bJlc&.qJ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 JJMSTUVWXY[\]^_`aJJJJJKK, "%lJGqqq.qSqqqc [ "%JGqqq.qTqqq' \ "%JGqqq.qUqqq ] "%JGqqq.qVqqqg ^ "%JGqqq.qWqqq _ "%JGqqq.qXqqq ` "%JGqqq.qYqqq aKmKn Ko "%&DqqKw.qcqaqqKq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk9R78 KKMCDKK,"K %K bKmc&.qK_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 KKMGHIJKLMNKKKKKKKK    , "%Kqqq.qqqq' G "%Kqqq.qqqq H "%KKqqq.qqqq  I78 KKM, "%Kqqq.qqqq' J "% Kqqq.qqqqU K "%Kqqq.qqqq' L "%Kqqq.qqqq M "%Kqqq.qqqq' N"L' %L( bL)mc&.qL1_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 L3L;MSTUVWXY[\]^_`aLL?L@LALB, "% Kqqq.qSqqq+ [ "%Kqqq.qTqqq' \ "%Kqqq.qUqqq ] "%Kqqq.qVqqqv ^ "%Kqqq.qWqqq _ "%Kqqq.qXqqq ` "%Kqqq.qYqqq aLL L "%&DqqL.qcqbqqLq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk: >78 LLMCDLLɁ),"L %L bLnc&.qL_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 LLMGHIJKLMNLLLLLLLL !"$%&'(, "%Lqqq.qqqq' G "%Lqqq.qqqq H "%M Lqqq.qqqq# I78 MMM, "%Lqqq.qqqq' J "% Lqqq.qqqqU K "%Lqqq.qqqq' L "%Lqqq.qqqq M "%Lqqq.qqqq' N"Mh %Mi bMjnc&.qMr_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3*78 MtM|MSTUVWXY[\]^_`aM}M~MMMMM+,-./01, "% Lqqq.qSqqq+) [ "%Lqqq.qTqqq') \ "%Lqqq.qUqqq) ] "%Lqqq.qVqqqv) ^ "%Lqqq.qWqqq) _ "%Lqqq.qXqqq) ` "%Lqqq.qYqqq) aMM M "%&DqqM.qcqcqqNq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered4;3Y78 NNMCoN N 5@,"N %N bNoc&.qN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2C3678 NN"MGHIJKLMNN#N$N%N&N'N(N)N*789;<=>?, "%N qqq.qqqq'5 G "%N qqq.qqqq5 H "%NLN qqq.qqqq:5 I78 NZN[M, "% N qqq.qqqqU5 J "% N qqq.qqqqU5 K "%N qqq.qqqq'5 L "%N qqq.qqqq5 M "%N qqq.qqqq'5 N"N %N bNoc&.qN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2o3A78 NNM}~NNNNNNNāBCDE, "%N qqq.qqqq@ } "%N qqq.qqqq@ ~ "%N qqq.qqqq@  "%FN qqq.qqqqF@ OOOOOO O O "O O %bcO&&Oi.&cl<cOOq_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorageVH G 78 OO MvO!I,"O$ %O% bO&Fvc&.qO._!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageF3J78 O0O9MO:O;OO?O@OAKLMNPQST, "%O!qqq.qqqqI  "%O!qqq.qqqqI  "%O!qqq.qqqqI  "%OrO!qqq.qqqqOI 8 O% "%O!qqq.qqqq'I  "%OO!qqq.qqqqRI 78 OOM+, "%&O!qqq.qqqq.I  "%OO!qqq.qqqqUI VMLShow78 OOMgOOOOfOπ?WXYZ>[OOOOOOOׁ\sρ,\shortSummaryXepisodesZartworkURL\lastSyncDate[releaseYearOO O "%&FqqO.qcqgqqOq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedF^k?]΄78 OOMCDOO_j,"O %O bOOc&.qP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage\C3`78 P PMGHIJKLMNPPPPPPPPabcefghi, "%Oqqq.qqqq'_ G "%Oqqq.qqqq_ H "%P<Oqqq.qqqqd_ I78 PJPKM, "%Oqqq.qqqq'_ J "% Oqqq.qqqqU_ K "%Oqqq.qqqq'_ L "%Oqqq.qqqq_ M "%Oqqq.qqqq'_ N"P %P bPOc&.qP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage\D3k78 PPMSTUVWXY[\]^_`aPPPPPPPlmnopqr, "%Oqqq.qSqqqj [ "%Oqqq.qTqqq'j \ "%Oqqq.qUqqqj ] "% Oqqq.qVqqqj ^ "%Oqqq.qWqqqj _ "%Oqqq.qXqqqj ` "%Oqqq.qYqqqj aQ Q! Q" "%&FqqQ*.qcqOqqQ2q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFukWtZՃ78 Q6Q9MCDQ:Q;v,"Q> %Q? bQ@Oc&.qQH_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragesC3w78 QJQSMGHIJKLMNQTQUQVQWQXQYQZQ[xyz|}~, "%Q:qqq.qqqq'v G "%Q:qqq.qqqqv H "%Q}Q:qqq.qqqq{v I78 QQM, "%Q:qqq.qqqq'v J "% Q:qqq.qqqqUv K "%Q:qqq.qqqq'v L "%Q:qqq.qqqqv M "%Q:qqq.qqqq'v N"Q %Q bQOc&.qQ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragesD378 QQMSTUVWXY[\]^_`aQQQQQQQ, "%Q;qqq.qSqqq [ "%Q;qqq.qTqqq' \ "%Q;qqq.qUqqq ] "% Q;qqq.qVqqq ^ "%Q;qqq.qWqqq _ "%Q;qqq.qXqqq ` "%Q;qqq.qYqqq aRaRb Rc "%&FqqRk.qcqOqqRsq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFXv78 RwRzMCoR{R|,"R %R bROc&.qR_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 RRMGHIJKLMNRRRRRRRR, "%R{qqq.qqqq' G "%R{qqq.qqqq H "%RR{qqq.qqqq I78 RRM, "% R{qqq.qqqqU J "% R{qqq.qqqqU K "%R{qqq.qqqq' L "%R{qqq.qqqq M "%R{qqq.qqqq' N"S %S bSOc&.qS%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageo378 S'S/M}~S0S1S2S3S4S5S6, "%R|qqq.qqqq } "%R|qqq.qqqq ~ "%R|qqq.qqqq  "%DR|qqq.qqqq  "% R|qqq.qqqqU  "%R|qqq.qqqq'  "%oR|qqq.qqqq2 SS S "%&FqqS.qcqOqqSq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFkYNH78 SSMCDSS,"S %S bSOc&.qS_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 SSMGHIJKLMNSSSSSSSS݁, "%Sqqq.qqqq' G "%Sqqq.qqqq H "%SSqqq.qqqq I78 T TM, "%Sqqq.qqqq' J "% Sqqq.qqqqU K "%Sqqq.qqqq' L "%Sqqq.qqqq M "%Sqqq.qqqq' N"T\ %T] bT^Oc&.qTf_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 ThTpMSTUVWXY[\]^_`aTqTrTsTtTuTvTw, "%Sqqq.qSqqq [ "%Sqqq.qTqqq' \ "%Sqqq.qUqqq ] "% Sqqq.qVqqq ^ "%Sqqq.qWqqq _ "%Sqqq.qXqqq ` "%Sqqq.qYqqq aTT T "%&FqqT.qcqOqqTq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFkZb78 TTMCDTTƀ,"U %U bUOc&.qU _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 U UMGHIJKLMNUUUUUUUUÁāŀ, "%Tqqq.qqqq' G "%Tqqq.qqqq H "%U@Tqqq.qqqq I78 UNUOM, "%Tqqq.qqqq' J "% Tqqq.qqqqU K "%Tqqq.qqqq' L "%Tqqq.qqqq M "%Tqqq.qqqq' N"U %U bUOc&.qU_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 UUMSTUVWXY[\]^_`aUUUUUUUȁɁʁˁ́́΀, "% Tqqq.qSqqq+ [ "%Tqqq.qTqqq' \ "%Tqqq.qUqqq ] "%Tqqq.qVqqq ^ "%Tqqq.qWqqq _ "%Tqqq.qXqqq ` "%Tqqq.qYqqq aV$V% V& "%&FqqV..qcqfqqV6q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFk>l!78 V:V=MCDV>V?ҁ݀,"VB %VC bVDOc&.qVL_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageπC378 VNVWMGHIJKLMNVXVYVZV[V\V]V^V_ԁՁց؁فځہ܀, "%V>qqq.qqqq' G "%V>qqq.qqqq H "%VV>qqq.qqqq׀ I78 VVM, "% V>qqq.qqqqU J "%V>qqq.qqqq' K "%V>qqq.qqqq' L "%V>qqq.qqqq M "%V>qqq.qqqq' N"V %V bVOc&.qV_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageπD378 VVMSTUVWXY[\]^_`aVVVVVVV߁, "%V?qqq.qSqqq [ "%V?qqq.qTqqq' \ "%V?qqq.qUqqq ] "% V?qqq.qVqqq ^ "%V?qqq.qWqqq _ "%V?qqq.qXqqq ` "%V?qqq.qYqqq aWeWf Wg "%&FqqWo.qcqOqqWwq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedFk[O78 W{W~MCDWW,"W %W bWOc&.qW_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 WWMGHIJKLMNWWWWWWWW, "%Wqqq.qqqq' G "%Wqqq.qqqq H "%WWqqq.qqqq I78 WWM, "%Wqqq.qqqq' J "% Wqqq.qqqqU K "%Wqqq.qqqq' L "%Wqqq.qqqq M "%Wqqq.qqqq' N"X %X bX!Oc&.qX)_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 X+X3MSTUVWXY[\]^_`aX4X5X6X7X8X9X:, "%Wqqq.qSqqq [ "%Wqqq.qTqqq' \ "%Wqqq.qUqqq ] "% Wqqq.qVqqq ^ "%Wqqq.qWqqqI _ "%Wqqq.qXqqq ` "%Wqqq.qYqqq a8 X% "%N qqq.qqqq'@  "%N qqq.qqqq'@  "%ON qqq.qqqq@ XX X "%&DqqX.qcqdqqXq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk<3i78 XXMCDXX,"X %X bXpc&.qX_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 YY MGHIJKLMNY Y Y Y YYYY    , "%Xqqq.qqqq' G "%Xqqq.qqqq H "%Y3Xqqq.qqqq  I78 YAYBM, "% Xqqq.qqqqU J "% Xqqq.qqqqU K "%Xqqq.qqqq' L "%Xqqq.qqqq M "%Xqqq.qqqq' N"Y %Y bYpc&.qY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD378 YYMSTUVWXY[\]^_`aYYYYYYY, "%Xqqq.qSqqq [ "%Xqqq.qTqqq' \ "%Xqqq.qUqqq ] "% Xqqq.qVqqq ^ "%Xqqq.qWqqq _ "%Xqqq.qXqqq ` "%Xqqq.qYqqq aZZ Z "%&DqqZ!.qcqeqqZ)q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk=yd78 Z-Z0MCDZ1Z2&,"Z5 %Z6 bZ7qc&.qZ?_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageC378 ZAZJMGHIJKLMNZKZLZMZNZOZPZQZR!"#$%, "%Z1qqq.qqqq' G "%Z1qqq.qqqq H "%ZtZ1qqq.qqqq  I78 ZZM, "%Z1qqq.qqqq' J "% Z1qqq.qqqqU K "%Z1qqq.qqqq' L "%Z1qqq.qqqq M "%Z1qqq.qqqq' N"Z %Z bZqc&.qZ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD3'78 ZZMSTUVWXY[\]^_`aZZZZZZZ()*+,-., "% Z2qqq.qSqqq+& [ "%Z2qqq.qTqqq'& \ "%Z2qqq.qUqqq& ] "%Z2qqq.qVqqq& ^ "%Z2qqq.qWqqq& _ "%Z2qqq.qXqqq& ` "%Z2qqq.qYqqq& a[X[Y [Z "%&Dqq[b.qcqfqq[jq_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered1k>0;=78 [n[qMCD[r[s2=,"[v %[w b[xrc&.q[_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage/C3378 [[MGHIJKLMN[[[[[[[[45689:;<, "%[rqqq.qqqq'2 G "%[rqqq.qqqq2 H "%[[rqqq.qqqq72 I78 [[M, "%[rqqq.qqqq'2 J "% [rqqq.qqqqU2 K "%[rqqq.qqqq'2 L "%[rqqq.qqqq2 M "%[rqqq.qqqq'2 N"\ %\ b\rc&.q\_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage/D3>78 \\&MSTUVWXY[\]^_`a\'\(\)\*\+\,\-?@ABCDE, "%[sqqq.qSqqq= [ "%[sqqq.qTqqq'= \ "%[sqqq.qUqqq= ] "% [sqqq.qVqqq= ^ "%[sqqq.qWqqq= _ "%[sqqq.qXqqq= ` "%[sqqq.qYqqq= a\\ \ "%&Dqq\.qcqgqq\q_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedHk?G|%p"78 \\MCD\\IT,"\ %\ b\sc&.q\_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageFC3J78 \\MGHIJKLMN\\\\\\\\ԁKLMOPQRS, "%\qqq.qqqq'I G "%\qqq.qqqqI H "%\\qqq.qqqqNI I78 ]]M, "%\qqq.qqqq'I J "% \qqq.qqqqUI K "%\qqq.qqqq'I L "%\qqq.qqqqI M "%\qqq.qqqq'I N"]S %]T b]Usc&.q]]_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageFD3U78 ]_]gMSTUVWXY[\]^_`a]h]i]j]k]l]m]nVWXYZ[\, "%\qqq.qSqqqT [ "%\qqq.qTqqq'T \ "%\qqq.qUqqqT ] "% \qqq.qVqqqT ^ "%\qqq.qWqqqT _ "%\qqq.qXqqqT ` "%\qqq.qYqqqT a8 ]%78 ]]M,78 ]]M,78 ]]M,]]^XDModelPackage]]]]]^XDModelPackage_XDUMLPackageImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp8 ]%78 ]]M,S2.1]]YXDPMModel]]WXDModel_NSKeyedArchiver])Troot"+5:?2DKXk0Ml~4GILOQSUX[]_aceghly %0HN#Cj   "$%*2?BDGIKZ !#%')+<>@BDFHJLNdwDJS`lv #5>}%')+-./0135679:CDFO^em     #&(+-/Ren   %.<IWl )8M[p &,9M[hmx"BDFHJLMNPQSTVXYZ\]botvx}ACEGIKMNP]nprtvxz|~6J`       G I K M O P Q R S U W X Y [ \ i j k m !!!!!! ! ! ! !!!!!!!!U!W!Y![!]!^!_!`!a!c!e!f!g!i!j!!!!!!!!!!!!!!!!!""""""" " " """""7"[""""""""""""""""""""""""""""##I#c#|###$$$$$ $!$"$#$$$&$($)$*$,$-$0$o$q$s$u$w$x$y$z${$}$$$$$$$$$$$$$$$$$$$$%%%%%% %!%"%#%%%'%(%)%+%,%/%n%p%r%t%v%w%x%y%z%|%~%%%%%%%%%%%%%%%%%%%&&&&&&& &!&"&$&&&'&(&*&+&4&B&O&]&j&}&&&''4'T'V'X'Z'\'^'_'`'b'c'e'f'i'k'l'm'o'p'u'''''''''''((=(?(A(C(E(G(I(J(L(Y(j(l(n(p(r(t(v(x(z((((((((((((((((((((((((()0)2)4)6)8)9):);)<)>)@)A)B)D)E))))))))))))))))))))))))))))))))))*=*?*A*C*E*F*G*H*I*K*M*N*O*Q*R******************************+9+;+=+?+A+B+C+D+E+G+I+J+K+M+N+s++++++++++++, ,,,,,,,,*,,,.,0,2,5,8,;,=,O,c,u,,,,-- - - ------------[-]-_-a-c-d-e-f-g-i-k-l-m-o-p-r---------------... . . ...........]....//6/]/}//////////////////////000(0L0s0000000000000000000000000000016181:1<1>1?1@1A1B1D1F1G1H1J1K111111111111111111111111111111222426282:2;2<2=2>2@2B2C2D2F2G2P2Q2S22222222222222222222222222222233 3333333>3a3d3333333333333333333344444444 4 4 44 4c4e4g4i4k4m4o4q4s4u4w4y4{4}44444444444444444444444444445555 5 5555555!5$5'5*5-505356595<5?5B5E5G5N5[5a5e5s5|5555555566 66(6<6E6P6^6q6x66666667 7.7N7n7p7r7t7v7x7y7z7|7}77777777777777777778 8D8F8H8J8L8N8P8Q8S8`8q8s8u8w8y8{8}88888888888888888888888888897999;9=9?9@9A9B9C9E9G9H9I9K9L99999999999999999999999999999::::::D:F:H:J:L:M:N:O:P:R:T:U:V:X:Y::::::::::::::::::::::::::::;;;@;B;D;F;H;I;J;K;L;N;P;Q;R;T;U;z;;;;;;;;;;;<<<<<<<< <"<1<3<5<7<9<<>B>i>>>>????A?C?E?G?I?K?N?P?R?U?W?Y?\?^?_?d?q?t?v?y?{?}???@@@@@@@@@ @-@>@@@B@D@F@H@J@L@N@_@a@c@e@g@i@k@m@o@q@@@@@@@@@@@@@@@AAAA A A AAAAAAAAAAXAZA\A^A`AaAbAcAdAfAhAiAjAlAmAAAAAAAAAAAAAAAAAAB BBBBBBBBBBBBB B!B`BbBdBfBhBiBjBkBlBnBpBqBrBtBuBBBBBBBBBBBBBBBBBCCCCCCDCFCHCJCLCMCNCOCPCRCTCUCVCXCYCaCnCsCuCwC|C~CCCCDD0D2D4D6D8D:D;D<D>D?DADBDDDFDGDHDJDKDPD]DbDdDfDkDmDoDqDDDEEE E E EEEEE!E2E4E6E8E:E<E>E@EBESEUEWEYE[E]E_EaEcEeEEEEEEEEEEEEEEEEEEEFFFFFFFF F F F FLFNFPFRFTFUFVFWFXFZF\F]F^F`FaFnFoFpFrFFFFFFFFFFFFFFFGGG G G GGGGGGGGGGGYG[G]G_GaGbGcGdGeGgGiGjGkGmGnGGGGGGGGGGGGGGGHHHHH H H H H HHHHHHH;H_HHHHHHHHHHHHHHHHHHHHHHHHHHIIIAICIEIGIIIJIKILIMIOIQIRISIUIVI_IIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJFJHJJJLJNJOJPJQJRJTJVJWJXJZJ[J^JJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKEKGKIKKKMKNKOKPKQKSKUKVKWKYKZKKKLL L LLLLLLLLLLLL L!L#L$L)L6L;L=L?LDLFLILKLpLLLLLLLLLLLLM MMMMMMMMM.M1M4M7M:M=M@MCMFMHMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN/N1N4N6N8N9N:N;N<N>N@NANBNDNENRNSNTNVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO=O?OAOCOEOFOGOHOIOKOMONOOOQOROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPCPjPPPPPPPPPPPPPPPPPPPPPPPPPPPQ-Q/Q1Q3Q6Q7Q8Q9Q:Q<Q>Q?Q@QBQCQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQR,R.R0R2R5R6R7R8R9R;R=R>R?RARBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS+S-S/S1S4S5S6S7S8S:S<S=S>S@SASJS]SjS}SSSSSSSSSSTT TT.TBTYTkTTTTTTTTTTTTTTTTUUUUUUU U U UUUUUURUTUVUXUZU[U\U]U^U`UbUcUdUfUgUUUVVVVVVV V!V$V%V'V(V*V,V-V.V1V2V7VDVIVKVMVRVUVXVZVVVVVVVVVVVVW WWW!W#W%W'W)W+W-W>WAWDWGWJWMWPWSWVWXWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXAXCXFXHXKXLXMXNXOXQXSXTXUXWXXXeXfXgXiXXXXXXXXXXXXXXXXXYYYYYY Y Y YYYYYYRYTYVYXY[Y\Y]Y^Y_YaYcYdYeYgYhYYYYYYYYYYYYYYYYYZZZZZZZ Z Z ZZZZZ7Z[ZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[F[H[K[M[P[Q[R[S[T[V[X[Y[Z[\[][_[[[[[[[[[[[[[[[[[[[[[[[\\\\\\\ \H\J\M\O\R\S\T\U\V\X\Z\[\\\^\_\b\\\\\\\\\\\\\\\\\\\\]]]]]]]] ] ] ]K]M]O]Q]T]U]V]W]X]Z]\]]]^]`]a]]]^^^^^^^^^^^!^"^$^&^'^(^+^,^1^>^C^E^G^L^O^R^T^y^^^^^^^^^^^_______!_#_%_'_8_;_>_A_D_G_J_M_P_R______________________________`;`=`@`B`E`F`G`H`I`K`M`N`O`Q`R`_```a`c```````````````````aaaaaaaa a a a aLaNaPaRaUaVaWaXaYa[a]a^a_aaabaaaaaaaaaaaaaaaaaaaabbbbbbbb b b b1bUb|bbbbbbbbbbbbbbbbbbbbbbbbbbcc@cBcDcFcIcJcKcLcMcOcQcRcScUcVcccccccccccccccccccccccccccccdd?dAdCdEdHdIdJdKdLdNdPdQdRdTdUdddddddddddddddddddddddddddddde>e@eBeDeGeHeIeJeKeMeOePeQeSeTeeefffff f f ffffffffffff$f1f6f8f:f?fBfEfGflffffffffffffg g gggggggg+g.g1g4g7g:g=g@gCgEggggggggggggggggggggggggggggggh.h0h3h5h8h9h:h;h<h>h@hAhBhDhEhRhShThVhhhhhhhhhhhhhhhhhhhhhhhhhhhhhii?iAiCiEiHiIiJiKiLiNiPiQiRiTiUiiiiiiiiiiiiiiiiiiiiiiiiiiiiiij$jHjojjjjjjjjjjjjjjjjjjjjjjjjjjjk3k5k7k9k<k=k>k?k@kBkDkEkFkHkIkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkl2l4l6l8l;l<l=l>l?lAlClDlElGlHlllllllllllllllllllllllllllllllm7m9m;m=m@mAmBmCmDmFmHmImJmLmMmmmmmmnnnnnn n n nnnnnnnnn*n/n1n3n8n;n>n@nennnnnnnnnnnnoooo o o oooo$o'o*o-o0o3o6o9o<o>o}ooooooooooooooooooooooooooooop'p)p,p.p1p2p3p4p5p7p9p:p;p=p>pKpLpMpOppppppppppppppppppppppppppppppq8q:q<q>qAqBqCqDqEqGqIqJqKqMqNqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrArhrrrrrrrrrrrrrrrrrrrrrrrrrrrs,s.s1s3s6s7s8s9s:s<s>s?s@sBsCsssssssssssssssssssssssssssssst,t.t1t3t6t7t8t9t:t<t>t?t@tBtCtEttttttttttttttttttttttttttttttu.u0u2u4u7u8u9u:u;u=u?u@uAuCuDuuuuuuuuuuuvvvvvv v v vvvv!v&v(v*v/v2v5v7v\vvvvvvvvvvvvvvvwwwwww www!w$w'w*w-w0w3w5wtwvwxwzw}w~wwwwwwwwwwwwwwwwwwwwwwwwxx x#x%x(x)x*x+x,x.x0x1x2x4x5xBxCxDxFxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy/y1y3y5y8y9y:y;y<y>y@yAyByDyEyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyzz8z_zzzzzzzzzzzzzzzzzzzzzzzzzzz{#{%{'{){,{-{.{/{0{2{4{5{6{8{9{x{z{|{~{{{{{{{{{{{{{{{{{{{{{{{{{{|"|$|'|)|,|-|.|/|0|2|4|5|6|8|9|<|{|}||||||||||||||||||||||||||||}%}'})}+}.}/}0}1}2}4}6}7}8}:};}}}}}}}}}}}}}}}}~~~~~~ ~~~~!~&~)~,~.~S~w~~~~~~~~~~~~~~~~~~~!$'*,kmoqtuvwxz|}~ !"#%'()+,9:;=|~&(*,/01235789;<{} /Vz} #$%&')+,-/0oqsuxyz{|~"#$%&(*+,./nprtwxyz{}!"#$%')*+-.y #%Jn !#bdfhklmnoqstuwx  "#0124suwy|}~!#&'()*,./023rtvx{|}~&Mqtvxz|~ "#$&'fhjlopqrsuwxy{| "#$&'*ikmorstuvxz{|~ "$%&()t Ae Y[]_bcdefhjklno '()+jlnpstuvwy{|} !#%&')*ikmorstuvxz{|~Dhkmoqsuvy ]_acfghijlnoprs \^`befghikmnoqr g 4X LNPRUVWXY[]^_ab ]_acfghijlnoprs \^`befghikmnoqr7[^`bdfhily QSUWZ[\]^`bcdfg QSUWZ[\]^`bcdfg \-QxEGIKNOPQRTVWXZ[VXZ\_`abceghikl UWY[^_`abdfghjk 0TWY[]_aber IKMORSTUVXZ[\^_ HJLNQRSTUWYZ[]^Sv Dk8:<>ABCDEGIJKMN IKMORSTUVXZ[\^_ HJLNQRSTUWYZ[]^#GJLNPRTUXetvxz|~=?ACFGHIJLNOPRS=?ACFGHIJLNOPRSHk9`-/136789:<>?@BC>@BDGHIJKMOPQST=?ACFGHIJLNOPRS<?ACEGIJMZikmoqsuw2468;<=>?ACDEGH2468;<=>?ACDEGH=` .Uy|~"$&(+,-./134578wy{}3579<=>?@BDEFHI2468;<=>?ACDEGH 1468:<>?BO^`bdfhjl{~&(*,/01235789;<{}%'*,/01235789;<>}3Vv$Kortvxz|}!"#$%')*+-.moqsvwxyz|~)+-/234568:;<>?~(*,.1234579:;=>}'*,.02458ETVXZ\^`bqtwz}€ƒ†ˆ!#&'()*,./023rtvx{|}~ÁÃÄÅÇÈ!#&'()*,./023rtvx{|}~ā㥹ćĈ(KkŋōŏőœŕŖŗŚśŝŞŠŢţŤŧŨŭźſ@dgikmoqruƂƓƕƗƙƛƝƟơƣƴƷƺƽ  "#bdfhklmnoqstuwxǷǹǼǾ "$'()*+-/0134suwy|}~ȀȂȄȅȆȈȉ!#&'()*,./023rtvx{|}~ɁɃɄɅɇɈɭ!#%')*-:IKMOQSUWfilorux{}ʼʾ!"#$%')*+-.moqsvwxyz|~ˀ˂˃ !"#$&()*,-lnpruvwxy{}~́̂"Ee͇͉͍͋ͅ͏͔͕͚͐͑͗ͧ͘͜͢͝͞͡ʹ͹ͻͽ:^acegiklo|΍ΏΑΓΕΗΙΛΝήαδηκν \^`befghikmnoqrϱϳ϶ϸϻϼϽϾϿ!"#$%')*+-.moqsvwxyz|~ЀЂЃ !"#$&()*,-lnpruvwxy{}~стѧ!#$'4CEGIKMOQ`cfiloruwҶҸҺҼҿ  !`bdfijklmoqrsuvӵӷӹӻӾӿ  _acehijklnpqrtuԴԶԸԺԽԾԿ8Xxz|~ՀՂՃՄՇՈՊՋՍՏՐՑՔՕ՚էլծհյոջս-QTVXZ\^_boրւքֆֈ֊֌֎֐ְֳֶֹֻ֤֧֪֭֡ OQSUXYZ[\^`abdeפצש׫׮ׯװױײ״׶׷׸׺׻  !`bdfijklmoqrsuvصطعػؾؿ  _acehijklnpqrtuٚپ '68:<>@BDSVY\_behjکګڮڰڳڴڵڶڷڹڻڼڽڿ TVXZ]^_`acefgij۩۫ۮ۰۳۴۵۶۷۹ۻۼ۽ۿ VXZ\_`abceghiklܫܭܯܱܴܷܸܼܾܵܶܺܽ /Ooqsuwyz{~݂݄݆݈݁݇݋݌ݑݞݣݥݧݬݯݲݴ$HKMOQSUVYfwy{}ށރޅއޘޛޞޡޤާުޭް޲FHJLOPQRSUWXY[\ߛߝߠߢߥߦߧߨߩ߲߫߭߮߯߱߿ WY[]`abcdfhijlm VXZ\_`abceghikl -/13579;JMPSVY\_a JLNPSTUVWY[\]_` IKMORSTUVXZ[\^_"Bbdfhjlmnqrtuwyz{~;>@BDFHILYjlnprtvxz9;=?BCDEFHJKLNO JLNPSTUVWY[\]_` IKMORSTUVXZ[\^_ "$&(*,.=@CFILORTBDFHKLMNOQSTUWXACEGJKLMNPRSTVW:Z\^`bdefijlmoqrsvw|368:<>@ADQbdfhjlnpr1357:;<=>@BCDFGBDFHKLMNOQSTUWXACEGJKLMNPRSTVW|  "$&58;>ADGJL68:<?@ABCEGHIKL579;>?@ABDFGHJK.NPRTVXYZ]^`adfghklq~(+-/13569FWY[]_acegx{~&(*,/01235789;<{}79;=@ABCDFHIJLM68:<?@ABCEGHIKLq *-0369<?A*,.0345679;<=?@!DkACFHJLORTVY[]`cdivy{~ "$%(5FHJLNPRTVgjmpsvy|"$&(+,-./134578wy{}.024789:;=?@ACD*,.0345679;<=?@Be5\)+-/234568:;<>?~:<>@CDEFGIKLMOP9;=?BCDEFHJKLNO8;=?ACEFIVegikmoqs.024789:;=?@ACD . 0 2 4 7 8 9 : ; = ? @ A C D                               9 \ |                             + R v y { }                           ! # % ( ) * + , . 0 1 2 4 5 t v x z } ~                             0 2 4 6 9 : ; < = ? A B C E F                              /13589:;<>@ABDE .13579;<?L[]_acegix{~#%'),-./0245689xz|~"$&(+,-./134578wy{}-PpFjmoqsuwx{ "$%&()hjlnqrstuwyz{}~$&(*-./0135679:y{}#%'),-./0245689xz|~"%')+-/03@OQSUWY[]lorux{~ !"#$&()*,-lnpruvwxy{}~ !"#%'()+,kmoqtuvwxz|}~!Dd;_bdfhjlmp}  ]_acfghijlnoprs"#$%&(*+,./nprtwxyz{}!"#$%')*+-.moqsvwxyz|~ "$%(5DFHJLNPRadgjmpsvx              ! " a c e g j k l m n p r s t v w               ! ! !!!!!!!!!!!! !!!`!b!d!f!i!j!k!l!m!o!q!r!s!u!v!!!!!!!!!!!!!!!"":"Z"z"|"~"""""""""""""""""""""""""# #1#U#X#Z#\#^#`#b#c#f#s####################$$$$$$ $ $ $ $$$$$$S$U$W$Y$\$]$^$_$`$b$d$e$f$h$i$$$$$$$$$$$$$$$$$$$%%%%%%%%%%% %!%"%$%%%d%f%h%j%m%n%o%p%q%s%u%v%w%y%z%%%%%%%%%%%%%%%&&&&&&&&&&&& &!&#&$&c&e&g&i&l&m&n&o&p&r&t&u&v&x&y&&&' '''''''''+':'<'>'@'B'D'F'H'W'Z']'`'c'f'i'l'n'''''''''''''''((((( ( ( (((((((((W(Y([(](`(a(b(c(d(f(h(i(j(l(m((((((((((((((())*)N)q)))**&*J*n*p*s*u*w*y*|******************+ +D+G+I+K+M+O+Q+R+U+b+s+u+w+y+{+}++++++++++++++++++++++++,,,,, ,,,O,Q,S,U,X,Y,Z,[,\,^,`,a,b,d,e,,,,,,,,,,,,,,,,,,------- - - - ------[-]-_-a-d-e-f-g-h-j-l-m-n-p-q-----------------------. .0.C...............................// //////"/%/(/+/-/9/F/////////0000000 0 000000%0*0,0.0306090;0`0000000000000111111 1 111"1%1(1+1.111417191x1z1|1~111111111111111111111111112"2$2'2)2,2-2.2/202224252628292F2G2H2J222222222222222222222222222222333537393<3=3>3?3@3B3D3E3F3H3I33333333333333333333333333333344<4c4444444444444444444444444445'5)5+5-50515253545658595:5<5=5|5~55555555555555555555555555556&6(6+6-60616263646668696:6<6=6|6~66666666666666666666666666667&7(7+7-70717273747678797:7<7=77777777777777788888 8 888!8#8%8*8-80828W8{8888888888888888899999999"9%9(9+9.909o9q9s9u9x9y9z9{9|9~99999999999999999999:::: :#:$:%:&:':):+:,:-:/:0:=:>:?:A::::::::::::::::::::::::::::::;*;,;.;0;3;4;5;6;7;9;;;<;=;?;@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<3LALDLGLJLLLeLLLLLLLLLLLLLLLLLLLMMMM MM,MUM^MqMvMMMMMMMNNNNN N_NaNcNeNhNiNjNkNlNnNpNqNrNtNuNNNNNNNNNNNNNNNO O OOOOOOOOOOOOO OkOOOOOOOOOOOOOOOOOOOOOOPPPP PPPP9P]PPPPPPPPPPPPPPPPPPPPPPPQQQQ Q QQQQQSQUQWQZQ[Q\Q]Q^Q`QbQcQdQfQgQQQQQQQQQQQQQQQQQRRRRRRR R R RRRRRR R!R#RbRdRfRhRkRlRmRnRoRqRsRtRuRwRxRRRRRRRRRRRRRRRS SSSSSSSSSSSSS!S"SaScSeSgSjSkSlSmSnSpSrSsStSvSwSSSSSSSSSSSSSSSSTT<T`TcTeTgTiTkTmTnTqT~TTTTTTTTTTTTTTTTTUUUUU U U U U UUUUUUUUUWUYU[U^U_U`UaUbUdUfUgUhUjUkUUUUUUUUUUUUUUUUVVVVV V V V VVVVVVVTVVVXVZV]V^V_V`VaVcVeVfVgViVjVVVVVVVVVVVVVVVVWWWWWW W W W WWWWWWWW W_WaWcWeWhWiWjWkWlWnWpWqWrWtWuWWWWWWWWWWWWWWWX X XXXXXXXXXXXXX XkXXXXXXXXXXXXXXXXXXXXXXYYYY YYYY8Y\YYYYYYYYYYYYYYYYYYYYYYYZZZZ Z ZZZPZRZTZVZYZZZ[Z\Z]Z_ZaZbZcZeZfZZZZZZZZZZZZZZZZZZ[[[[[[[ [ [ [[[[[[ ["[a[c[e[g[j[k[l[m[n[p[r[s[t[v[w[[[[[[[[[[[[[[[\ \ \\\\\\\\\\\\ \!\`\b\d\f\i\j\k\l\m\o\q\r\s\u\v\\\\\\\\\\\\\\\\]];]_]b]d]f]h]j]l]m]p]}]]]]]]]]]]]]]]]]]]^^^^ ^ ^ ^ ^ ^^^^^^^U^W^Y^[^^^_^`^a^b^d^f^g^h^j^k^^^^^^^^^^^^^^^^____ _ _ _ _ _______U_W_Y_[_^___`_a_b_d_f_g_h_j_k________________````` ` ` ` `````````````````````````````````aaaaa-aQaxaaaaaaaaaaaaaaaaaaaaaaaaaabbbbEbGbIbKbNbObPbQbRbTbVbWbXbZb[bbbbbbbbbbbbbbbbbbbbbbbbbccccccccccVcXcZc\c_c`cacbcccecgchcickclcccccccccccccccddddd d d d d dddddddUdWdYd[d^d_d`dadbdddfdgdhdjdkdddddddddddddddde e0eTeWeYe[e]e_eaebeeereeeeeeeeeeeeeeeeeeeeeeeffffffff f fJfLfNfPfSfTfUfVfWfYf[f\f]f_f`fffffffffffffffffffffgggggggg g gJgLgNgPgSgTgUgVgWgYg[g\g]g_g`gggggggggggggggggggggghhhhhhh h hUhxhhhhhhhhhhhhhhhhhhhhhhhhhhhhi"iFimiiiiiiiiiiiiiiiiiiiiiiiiiiiiij:j<j>j@jCjDjEjFjGjIjKjLjMjOjPjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkk k k kKkMkOkQkTkUkVkWkXkZk\k]k^k`kakkkkkkkkkkkkkkkkkkkkkllllllll l lJlLlNlPlSlTlUlVlWlYl[l\l]l_l`lllllllllllllllllm%mImLmNmPmRmTmVmWmZmgmvmxmzm|m~mmmmmmmmmmmmmmmmmmmmmmmmmmmn>n@nBnDnGnHnInJnKnMnOnPnQnSnTnnnnnnnnnnnnnnnnnnnnnnnnnnnnnno=o?oAoCoFoGoHoIoJoLoNoOoPoRoSoooooooooooooooooooooooooooooopHpkppppppppppppppppppppppppppppqq9q`qqqqqqqqqqqqqqqqqqqqqqqqqqqqqr-r/r1r3r6r7r8r9r:r<r>r?r@rBrCrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrs>s@sBsDsGsHsIsJsKsMsOsPsQsSsTsssssssssssssssssssssssssssssst=t?tAtCtFtGtHtItJtLtNtOtPtRtStttttttttttttttttuu<u?uAuCuEuGuIuJuMuZuiukumuouqusuuuwuuuuuuuuuuuuuuuuuuuuuuuuv2v4v6v8v;v<v=v>v?vAvCvDvEvGvHvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvw2w4w6w8w;w<w=w>w?wAwCwDwEwGwHwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwx=x`xxxxxxxxxxxxxxxxxxxxxxxxxxxxy y/yVyzy}yyyyyyyyyyyyyyyyyyyyyyyyyyyz#z%z'z)z,z-z.z/z0z2z4z5z6z8z9zxzzz|z~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{4{6{8{:{={>{?{@{A{C{E{F{G{I{J{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|3|5|7|9|<|=|>|?|@|B|D|E|F|H|I|||||||||||||||||}}2}5}7}9};}=}?}@}C}P}_}a}c}e}g}i}k}m}|}}}}}}}}}}}}}}}}}}}}}}}~'~)~+~-~0~1~2~3~4~6~8~9~:~<~=~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&(*,/01235789;<{}1Tt#Jnqsuwy{| !"#$&()*,-lnpruvwxy{}~(*,.1234579:;=>}')+-01234689:<=|~&)+-/1347DSUWY[]_apsvy|!$%&'(*,-.01prtvyz{|}/Sw,Ps-.0257:<>ACEHKMOQTWZ_loqtwy +<>@BDFHJL]`cfiloruw   !`bdfijklmoqrsuv !"#$&()*,-lnqsvwxyz|~    TVY[^_`abdfghjk};[]_acfghklnoqtuvyz69;=?ACDGTegikmoqsu468:=>?@ACEFGIJEGIKNOPQRTVWXZ[DFHJMNOPQSUVWYZ !#%')8;>ADGJMO8:<>ABCDEGIJKMN79;=@ABCDFHIJLM0PRTVX[\]`acdgjklopu,/13579:=J[]_acegik|*,.0345679;<=?@;=?ADEFGHJLMNPQ:<>@CDEFGIKLMOPu.147:=@CE.024789:;=?@ACD-/136789:<>?@BC?c?_2Y}&(*,/01235789;<{}%'*,/01235789;<EFH  1D!$&5=  !#%*-02W{"%(+.0oqsuxyz{|~ #$%&')+,-/0=>?A*,.0345679;<=?@3Z~ #%()*+,.01245tvxz}~ #%()*+,.01245tvxz}~ "$'()*+-/0134!$')Nr "%'fhjlopqrsuwxy{| "#$&'4568wy{}!#%'*+,-.023467vxz|*Quxz|~ !"#%'()+,kmoqtuvwxz|}~ !"#%'()+,kmoqtuvwxz|}~ !"$&'(*+47:<AJclCg?c9]`bdfhjkn{  []_adefghjlmnpq  %&(gikmpqrstvxyz|}$cegilmnoprtuvxy ^-QxEGIKNOPQRTVWXZ[VXZ\_`abceghikl     UWY[^_`abdfghjk 0TWY[]_aber  JLNPSTUVWY[\]_`  JLNPSTUVWY[\]_`Ÿ¡£¥¨©ª«¬®°±²´µ  UxØøúüþ$HoēĖĘĚĜĞĠġĤı<>@BEFGHIKMNOQRőœŕŗŚśŜŝŞŠŢţŤŦŧ   MOQSVWXYZ\^_`bcƢƤƦƨƫƬƭƮƯƱƳƴƵƷƸ    LNPRUVWXY[]^_abǡǣǥǧǪǫǬǭǮǰDzdzǴǶǷ'KNPRTVXY\ixz|~ȀȂȄȆȕȘțȞȡȤȧȪȬACEGJKLMNPRSTVWɖɘɚɜɟɠɡɢɣɥɧɨɩɫɬACEGJKLMNPRSTVWʖʘʚʜʟʠʡʢʣʥʧʨʩʫʬ  VXZ\_`abceghikl˫˭˯˱˴˵˶˷˸˺˼˽˾    b̥̅ /Szͣͥͧͩͫͬͯ͞͡ͼGIKMPQRSTVXYZ\]ΜΞΠ΢ΥΦΧΨΩΫέήίαβXZ\^abcdegijkmnϭϯϱϳ϶ϷϸϹϺϼϾϿ   WY[]`abcdfhijlmЬЮавежзийлноп 2VY[]_acdgtухчщыэяёѠѣѦѩѬѯѲѵѷ   KMOQTUVWXZ\]^`aҠҢҤҦҩҪҫҬҭүұҲҳҵҶ  JLNPSTUVWY[\]_`ӟӡӣӥӨөӪӫӬӮӰӱӲӴӵ  UxԘԸԺԼԾ"FmՑՔՖ՘՚՜՞՟բկ:<>@CDEFGIKLMOP֏֑֛֢֤֥֚֓֕֘֙֜֞֠֡   KMOQTUVWXZ\]^`aנעפצשת׫׬׭ׯױײ׳׵׶  JLNPSTUVWY[\]_`؟ءأإبةتثجخذرزشص%ILNPRTVWZgvxz|~ـقلٖٜٟٓٙ٢٥٨٪>@BDGHIJKMOPQSTړڕڗڙڜڝڞڟڠڢڤڥڦڨک=?ACFGHIJLNOPRSے۔ۖۘۛۜ۝۞ۣ۟ۡۤۥۧۨHk܋ܫܭܯܱܷܻܾܳܵܶܺܽ9`݄݇݉݋ݍݏݑݒݕݢݳݵݷݹݻݽݿ-/136789:<>?@BCނބކވދތލގޏޑޓޔޕޗޘ>@BDGHIJKMOPQSTߓߕߗߙߜߝߞߟߠߢߤߥߦߨߩ=?ACFGHIJLNOPRS<?ACEGIJMZikmoqsuw1357:;<=>@BCDFG02469:;<=?ABCEF;^~,Swz|~ "$&)*+,-/12356uwy{~1357:;<=>@BCDFG02469:;<=?ABCEF /2468:<=@M\^`bdfhjy|%')+./0124678:;z|~$&(*-./0135679:y{}/135789:;=?@ACD8[{)Ptwy{}!#&'()*,./023rtvx{|}~.024789:;=?@ACD-/136789:<>?@BC,/13579:=JY[]_acegvy|!#%'*+,-.023467vxz| "$&)*+,-/12356uwy{~+NnCgjlnprtux!"#%&egiknopqrtvwxz{!#%'*+,-.023467vxz| "$&)*+,-/12356uwy{~"$&(*,-0=LNPRTVXZilorux{~ !#%&')*ikmorstuvxz{|~ "$%&()hjlnqrstuwyz{}~Aa6Z]_aceghkx   XZ\^abcdegijkmn !#%&')*ikmorstuvxz{|~ "$%&()hjlnqrstuwyz{}~ #0?ACEGIKM\_behknqs  ]_acfghijlnoprs  ]_acfghijlnoprs6Vvxz|~+ORTVXZ\]`m~    MOQSVWXYZ\^_`bc   ^`bdghijkmopqst                ] _ a c f g h i j l n o p r s             % 4 6 8 : < > @ B Q T W Z ] ` c f h                               R T V X [ \ ] ^ _ a c d e g h                               R T V X [ \ ] ^ _ a c d e g h                 + K k m o q s u v w z { } ~                 !EHJLNPRSVctvxz|~CEGILMNOPRTUVXY    TVXZ]^_`acefgij    SUWY\]^_`bdefhi  *,.02468GJMPSVY\^GIKMPQRSTVXYZ\]>a:^`cegiloqsvxz}479;=?ABERcegikmoqs2468;<=>?ACDEGH>@BDGHIJKMOPQST   _adfijklmoqrsuv} Wz%Ip=?ACFGHIJLNOPRS   NPRTWXYZ[]_`acd    MOQSVWXYZ\^_`bc(LOQSUWYZ]jy{}   A C E G J K L M N P R S T V W                            !!!@!B!D!F!I!J!K!L!M!O!Q!R!S!U!V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""K"n""""""""""""""""""""""""""""##>#e#############################$2$4$6$8$;$<$=$>$?$A$C$D$E$G$H$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%C%E%G%I%L%M%N%O%P%R%T%U%V%X%Y%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&B&D&F&H&K&L&M&N&O&Q&S&T&U&W&X&&&&&&&&&&&&&&&&&''A'D'F'H'J'L'N'O'R'_'n'p'r't'v'x'z'|''''''''''''''''''''''''(6(8(:(<(?(@(A(B(C(E(G(H(I(K(L(((((((((((((((((((((((((((((()5)7)9);)>)?)@)A)B)D)F)G)H)J)K))))))))))))))))))))))))))))))*@*c****************************++4+[+++++++++++++++++++++++++++++,(,*,,,.,1,2,3,4,5,7,9,:,;,=,>,},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-9-;-=-?-B-C-D-E-F-H-J-K-L-N-O------------------------------.8.:.<.>.A.B.C.D.E.G.I.J.K.M.N.................//7/:/</>/@/B/D/E/H/U/d/f/h/j/l/n/p/r////////////////////////0,0.000205060708090;0=0>0?0A0B0000000000000000000000000000001+1-1/1114151617181:1<1=1>1@1A111111111111111111111111111111272Z2z22222222222222222222222222233*3Q3u3x3z3|3~33333333333333333333333344 4"4$4'4(4)4*4+4-4/404143444s4u4w4y4|4}4~4444444444444444444444444445/51535558595:5;5<5>5@5A5B5D5E5555555555555555555555555555556.6062646768696:6;6=6?6@6A6C6D666666666666666667 7-70727476787:7;7>7K7Z7\7^7`7b7d7f7h7w7z7}7777777777777777777778"8$8&8(8+8,8-8.8/8183848587888w8y8{8}888888888888888888888888889!9#9%9'9*9+9,9-9.9092939496979v9x9z9|99999999999999999999999999:,:O:o::::::::::::::::::::::::::::;;F;j;m;o;q;s;u;w;x;{;;;;;;;;;;;;;;;;;;;;<<<<<<<<< <"<$<%<&<(<)#>%>'>)>,>->.>/>0>2>4>5>6>8>9>x>z>|>~>>>>>>>>>>>>>>?"?%?'?)?+?-?/?0?3?@?O?Q?S?U?W?Y?[?]?l?o?r?u?x?{?~?????????????????@@@@@!@"@#@$@%@'@)@*@+@-@.@m@o@q@s@v@w@x@y@z@|@~@@@@@@@@@@@@@@@@@@@AAAAA!A"A#A$A%A'A)A*A+A-A.AmAoAqAsAvAwAxAyAzA|A~AAAAAAAAAAAAAAAAAAAB#BFBfBBBBBBBBBBBBBBBBBBBBBBBBBBBBCC<C`CcCeCgCiCkCmCnCqC~CCCCCCCCCCCCCCCCCCCD D D DDDDDDDDDDDDD^D`DbDdDgDhDiDjDkDmDoDpDqDsDtDDDDDDDDDDDDDDDDDDDEEEE E#E$E%E&E'E)E+E,E-E/E0EoEqEsEuExEyEzE{E|E~EEEEEEEEEEEEEEEEEEEEFFFFF"F#F$F%F&F(F*F+F,F.F/FnFpFrFtFwFxFyFzF{F}FFFFFFFFGGGGG!G#G%G&G)G6GEGGGIGKGMGOGQGSGbGeGhGkGnGqGtGwGyGGGGGGGGGGGGGGGH HHHHHHHHHHHH H"H#HbHdHfHhHkHlHmHnHoHqHsHtHuHwHxHHHHHHHHHHHHHHHI IIIIIIIIIIIII!I"IaIcIeIgIjIkIlImInIpIrIsItIvIwIIIIIIIIIIIIIIIJJ:JZJzJ|J~JJJJJJJJJJJJJJJJJJJJJJJJJK K1KUKXKZK\K^K`KbKcKfKsKKKKKKKKKKKKKKKKKKKKLLLLLL L L L LLLLLLSLULWLYL\L]L^L_L`LbLdLeLfLhLiLLLLLLLLLLLLLLLLLLLMMMMMMMMMMM M!M"M$M%MdMfMhMjMmMnMoMpMqMsMuMvMwMyMzMMMMMMMMMMMMMMMNNNNNNNNNNNN N!N#N$NcNeNgNiNlNmNnNoNpNrNtNuNvNxNyNNNO OOOOOOOOO+O:O<O>O@OBODOFOHOWOZO]O`OcOfOiOlOnOOOOOOOOOOOOOOOPPPPP P P PPPPPPPPPWPYP[P]P`PaPbPcPdPfPhPiPjPlPmPPPPPPPPPPPPPPPQQQQQ Q Q QQQQQQQQQWQYQ[Q]Q`QaQbQcQdQfQhQiQjQlQmQQQQQQQQQQQQQQQQQQR RRRRRRRRRRRR R"R#RbRdRfRhRkRlRmRnRoRqRsRtRuRwRxRRRRRRRRRRRRRRRSS<S\S|S~SSSSSSSSSSSSSSSSSSSSSSSSSST T1TUTXTZT\T^T`TbTcTfTsTTTTTTTTTTTTTTTTTTTTUUUUUU U U U UUUUUUSUUUWUYU\U]U^U_U`UbUdUeUfUhUiUUUUUUUUUUUUUUUUUUUVVVVVVVVVVV V!V"V$V%VdVfVhVjVmVnVoVpVqVsVuVvVwVyVzVVVVVVVVVVVVVVVWWWWWWWWWWWW W!W#W$WcWeWgWiWlWmWnWoWpWrWtWuWvWxWyWWWX XXXXXXXXX+X:X<X>X@XBXDXFXHXWXZX]X`XcXfXiXlXnXXXXXXXXXXXXXXXYYYYY Y Y YYYYYYYYYWYYY[Y]Y`YaYbYcYdYfYhYiYjYlYmYYYYYYYYYYYYYYYZZZZZ Z Z Z ZZZZZZZZVZXZZZ\Z_Z`ZaZbZcZeZgZhZiZkZlZZZZZZZZZZZZZZZ[ [/[O[o[q[s[u[w[y[z[{[~[[[[[[[[[[[[[[[[[[[\\(\L\O\Q\S\U\W\Y\Z\]\j\{\}\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]] ] ]J]L]N]P]S]T]U]V]W]Y][]\]]]_]`]]]]]]]]]]]]]]]]]]]^^^ ^ ^^^^^^^^^^^^[^]^_^a^d^e^f^g^h^j^l^m^n^p^q^^^^^^^^^^^^^^^___ _ ____________Z_\_^_`_c_d_e_f_g_i_k_l_m_o_p___``` ` ` `````"`1`3`5`7`9`;`=`?`N`Q`T`W`Z`]```c`e``````````````````aaaaaaa a a a aaaOaQaSaUaXaYaZa[a\a^a`aaabadaeaaaaaaaaaaaaaaaaaabbbbbbb b b b bbbObQbSbUbXbYbZb[b\b^b`babbbdbebbbbbbbbbbbbbbbcc(cHchcjclcncpcrcsctcwcxczc{c}ccccccccccccccccddAdDdFdHdJdLdNdOdRd_dpdrdtdvdxdzd|d~dddddddddddddddddddddddddee?eAeCeEeHeIeJeKeLeNePeQeReTeUeeeeeeeeeeeeeeeeeeeeeefffffff f f ffffPfRfTfVfYfZf[f\f]f_fafbfcfeffffffffffffffffffffggggggg g g g gggOgQgSgUgXgYgZg[g\g^g`gagbgdgegggggghhhhhh hh&h(h*h,h.h0h2h4hChFhIhLhOhRhUhXhZhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiCiEiGiIiLiMiNiOiPiRiTiUiViXiYiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjBjDjFjHjKjLjMjNjOjQjSjTjUjWjXjjjjjjjjjjjjjjjjkk;k[k]k_kakckekfkgkjkkkmknkpkrksktkwkxk}kkkkkkkkkkll4l7l9l;l=l?lAlBlElRlclelglilklmlolqlslllllllllllllllllllllllllm2m4m6m8m;m<m=m>m?mAmCmDmEmGmHmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnCnEnGnInLnMnNnOnPnRnTnUnVnXnYnnnnnnnnnnnnnnnnnnnnnnnnnnnooooBoDoFoHoKoLoMoNoOoQoSoToUoWoXo}ooooooooooop ppppp!p#p%p'p6p9p<p?pBpEpHpKpMppppppppppppppppppppppppppppppq6q8q:q<q?q@qAqBqCqEqGqHqIqKqLqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr5r7r9r;r>r?r@rArBrDrFrGrHrJrKrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsss%s9sPsbskslsns{s|s}sssssssss^sMediaLibrary.xcdatamodeld/MediaLibrary-2.1.xcdatamodel/layout000066400000000000000000000634321250533726500244600ustar00rootroot00000000000000bplist00 ^ _X$versionX$objectsY$archiverT$top"<STX`flqtx|  $.2>?CGKNQ\]`klmnquy  $(,/2=>BMNOSW[fgkosvy  #-1;FGKOSVYdefjuvw{ ()-158;FGHIMXYZ^bfglv|()*.7:>CGHMSV[^adjsw!"'-038;>AGPQU^ghlu~ "+456:CEFKQTY\_bhqu~ "%(-036<EFJT]^bluvw{  A B C D E F G H I J K L M N O P Q R S T U V W X \U$null WNS.keysZNS.objectsV$class Wstorage_hasCombinedRelationshipsXmappings !\XDDataSource_XDDiagramControllerZXDGraphicsZXDDelegate #;$%&'()*+,-./0123456789:(8IXk{΀&ހdj#6=>?@ABC DEFHIJKLMNOPR_XDDiagramStorage_XDTailConnectionXXDBoundsZXDUniqueID]XDHeadLineEnd]XDTailLineEnd_XDDrawingStyles_XDHeadConnectionZXDLineType^XDGraphicFlags%  '"_{{146, 483.5}, {68, 75}} UWV  YZ[\]$_XXDShadowYXDGraphic_XDShadowStyleFlags  abcde_NSShadowBlurRadius\NSShadowVert #@ # ghijZ$classnameX$classesXNSShadowikXNSObjectghmn]XDShadowStyleopk]XDShadowStyle^XDDrawingStyleghrsWNSArrayrku vwVXDUUID yz{YNS.string_$DD1536DB-EA87-4954-9B44-AB3B12EB1025gh}~_NSMutableString}kXNSStringgh[XDGraphicIDk[XDGraphicID Z_$VXDName^XDLineEndFlagsXXDOrigin\XDIdentifierWXDSlopeWXDWidthUXDGapYXDLineGap\XDBezierPath"A"?"^XDArrowLineEndUArrow\{214, 558.5}V{1, 0} ZNSSegmentsO$A@@A@gh\NSBezierPathk\NSBezierPathghYXDLineEndk Z_$ "A"?"!_XDDoubleArrowsLineEnd]Double Arrows\{146, 483.5}W{-1, 0} OHA@@A@AA@@AA@ Z9$_XDTargetGraphic#$F =C?@P_XDCollapsedCompartments^XDCompartments_XDCompartmentGraphicFlagsgh\XDConnectionk\XDConnection Z1$&$F =C?@P݁gh]XDLineGraphick]XDLineGraphicYXDGraphic=>?@ABC DEFNP7)-/2*'5_{{342, 495.5}, {63, 48}} W+ YZ[\%_,( abc #@ # u w. yz_$F01FF926-739B-4B33-80AA-2B16187932EB Z_  % 0"A"?"(1\{405, 495.5} O$A@@A@ Z_%3 "A"?"(4\{342, 543.5} OHA@@A@AA@@AA@ Z:%6$(F =C?@%)*+P-Ӂ́ˀ Z9%#$(=>?@ABC DEF456789N;P=H9=?B:'Gp_{{146, 483.5}, {68, 75}} @WA; YZ[\E&_<8 abcIJ #@ # u Lw> yzP_$E65F2118-6C48-4199-A516-FCFF161B0504 Z_SWXY&[@ "A"?"8A\{146, 483.5} ^O$A@@A@ Za_bdfgh&jDEC"A"?"8F_XDStraightLineEndXStraight\{214, 558.5} oOA Z1&&$8 Z9&#$8=>?@ABC DEF{|}~NPWJNPSK'V`_{{342, 495.5}, {63, 48}} WL YZ[\'_MI abc #@ # u wO yz_$63B6001B-0760-479A-9DFA-12D2FB64A387 Z_'Q "A"?"IR\{342, 543.5} O$A@@A@ Za_d'DTC"A"?"IU\{405, 495.5} OA Z9'#$I Z:'6$I=>?@ABC DEFNPɀiY]_cZ'h _{{146, 69.5}, {266, 459}} Ẁ[ YZ[\(_\X abcր #@ # u w^ yz܀_$33CCD5F0-42A5-497C-9898-5E3D5E02D717 Z_(a` "A"?"Xb^XDArrowLineEnd\{146, 528.5} [NSLineWidthO$A@@A@#@ Z_(efd"A"?"Xg_XDDoubleArrowsLineEnd]Double Arrows[{412, 69.5} OHA@@A@AA@@AA@#@ Z1(&$X Z6(j$XF =C?@ P~vu|=>?@ABC DEFNPzlprum'yP_{{146, 69.5}, {266, 459}} !W"n YZ[\&)_ok abc*+ #@ # u -wq yz1_$6B0EE429-E70B-49BC-BBE0-83DEB5DCB31D Z_489:)=C?@\]^_N`bce4'}|_5{{476.86206896551727, 78}, {0.27586206896546628, 12}} hWi~ YZ[\m*_{ abcqr #@ # u tw yzx_$37A993E3-3A21-4611-A291-50785EACA484 Zz_{}~*"A"?"{_XDEmptyArrowLineEnd[Empty Arrow_{476.86206896551727, 78}_{-0.27586206896546628, -12} O-A@@A@#@ Z6*j${ Z7*${F =C?@PDFAE >=C?@_N$'_6{{540, 38.754901960784316}, {25, 0.49019607843136725}} W YZ[\+_ abc #@ # u w yz_$351DBB49-52E9-4954-BAD5-EB77AA5B98CB Zz_}+ƀ"A"?"_{540, 39.245098039215684}_{-25, 0.49019607843136725} ̀O-A@@A@#@ Z6+j$ Z8+$F =C?@Pށ=>?@ABC DEFNP'_{{335, 340.5}, {70, 29}} W퀜 YZ[\,_ abc #@ # u w yz_$2AE9F60C-B948-4134-A6BB-A4D8A976F40D Z_,"A"?"^XDArrowLineEnd\{405, 340.5}   O$A@@A@#@ Za_,D "A"?"_XDStraightLineEnd\{335, 369.5} OA#@ Z2,$F =C?@$()*P,3' % Z4,$F =C?@2678P:cUMLS=>?@ABC DEF=>?@ABNDP'_{{146, 354.5}, {61, 159}} HWI YZ[\M-_ abcQR #@ # u Tw yzX_$A027925D-A479-4AAE-B3E6-B48EB98E7516 Z_[]_`a-c"A"?"^XDArrowLineEnd\{207, 354.5} hiO$A@@A@#@ Za_lnpqr-tD "A"?"_XDStraightLineEnd\{146, 513.5} yzOA#@ Z4-$ Z1-&$=>?@ABC DEFNPɀ̀€Āɀ'̀_{{146, 354.5}, {61, 159}} W YZ[\._ abc #@ # u wÀ yz_$086D1CD5-2AE0-4907-9781-66C0FAA162FF Z_.ƀǀŀ "A"?"_XDDoubleArrowsLineEnd]Double Arrows\{146, 513.5} OHA@@A@AA@@AA@#@ Z_].ʀ"A"?"\{207, 354.5} €O$A@@A@#@ Z1.&$ Z4.$=>?@ABC DEFNP߀πӀՀڀЀ'݀_{{146, 129.5}, {43, 369}} Wـр YZ[\/_Ҁ abc #@ # u wԀ yz_$D6C2A281-9EAC-4C65-9451-96EDAC2FFA20 Z_/׀؀ր"A"?"΀_XDDoubleArrowsLineEnd]Double Arrows\{189, 129.5} OHA@@A@AA@@AA@#@ Z_/׀ۀր "A"?"΀\{146, 498.5}   OHA@@A@AA@@AA@#@ Z3/ހ$F =C?@PK=54; Z1/&$=>?@ABC DEF !"#$N&P'_{{146, 129.5}, {43, 369}} *W+ YZ[\/0_ abc34 #@ # u 6w yz:_$05C14C76-1BE9-424C-834A-39925F07D400 Z<_=?ABC0E "A"?"_XDDoubleArrowsLineEnd]Double Arrows\{146, 498.5} KLOHA@@A@AA@@AA@#@ Za_OQSTU0WD"A"?"_XDStraightLineEnd\{189, 129.5} \]OA#@ Z10&$ Z30ހ$_{{18, 12}, {128, 523}} hWijm Znopqr1tuP[XDFillColor_XDGradientColor_XDGradientAngle_XDFillStyleFlags&"Cwx yz{UNSRGB\NSColorSpaceO0.79 0.63108281 0.679980358gh}~WNSColor}kwx z{O&0.9299240239 0.8770276033 0.893220054gh_XDCompartmentGraphicFillStylek_XDCompartmentGraphicFillStyle[XDFillStyle^XDDrawingStyle Z1[XDLineWidth]XDStrokeColor_XDStrokeStyleFlags"?&wx z{O'0.5266666667 0.4207218733 0.4533202387gh]XDStrokeStylek]XDStrokeStyle^XDDrawingStyleu w yz_$A1A53950-6EAB-4341-9B84-8A9083E728DE ; 1_XDCompartmentFlagsWXDLabel_XDCompartmentItemMinSize[XDIconImage_XDCompartmentGraphic_XDBackgroundColor_XDCompartmentItem@&_/XDPPCompartmentGraphicNameCompartmentIdentifier ]XDCompartmentZXDDataCell _[NSCellFlags\NSCellFlags2_XDAlternateImageYNSSupport_XDCompartmentItemCellFlagsWXDImage_NSBackgroundColor[NSTextColor^XDButtonTarget@   VNSSizeXNSfFlagsVNSName#@& _#.HelveticaNeueDeskInterface-RegularghVNSFontk x{[NSColorName]NSCatalogNameWNSColor VSystem_textBackgroundColorx {WNSWhiteB1 x{  YtextColorx {B0gh_XDCompartmentItemCellk_XDCompartmentItemCell_NSTextFieldCell\NSActionCellVNSCellgh_XDCompartmentItemk_XDCompartmentItemW{0, 15}gh]XDCompartmentk]XDCompartment  1&_5XDPPCompartmentGraphicAttributesCompartmentIdentifierZAttributes  _   !$1'&_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships - _'  gh89^NSMutableArray8rk; <=\NSRangeCountgh?@_NSMutableIndexSetABk_NSMutableIndexSetZNSIndexSetghDE_XDCompartmentGraphicFk_XDCompartmentGraphic_{{405, 199}, {128, 148}} IWJK!#m Znopqr2QRP""Cwx Tz{O&0.9299240239 0.8770276033 0.893220054 ZW2Z"?$wx \z{O'0.5266666667 0.4207218733 0.4533202387u _w& yzc_$270F9D7A-1B77-4611-8479-15CE692914EF e;fgh(,0 2r) v*x _r{ZNSContents)+  P  2- g,.x _-/  Tname !$21 h02 _  1; <=_{{189, 63}, {128, 75}} W69m Znopr3P7ށ8"Cwx z{O0.79 0.63108281 0.679980358wx z{O&0.9299240239 0.8770276033 0.893220054 Z3"?ށ:wx z{O'0.5266666667 0.4207218733 0.4533202387u w< yzҀ_$29E8FC6E-8B91-4E6B-B147-0B6B6FB0F22B ;ׁ>BF 3?ހ@_/XDPPCompartmentGraphicNameCompartmentIdentifier >A _  @ 3CހD_5XDPPCompartmentGraphicAttributesCompartmentIdentifier BE _  D   3HGހI_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships FJ _  I; <=_{{207, 168}, {128, 210}} #W$%NQm Znop(r4+,POP"Cwx .z{O0.79 0.63108281 0.679980358wx 1z{O&0.9299240239 0.8770276033 0.893220054 Z447"?Rwx 9z{O'0.5266666667 0.4207218733 0.4533202387u <wT yz@_$22ABA8CE-43F9-4BF9-9C09-A21136F81111 B;CDEVZ^ L4OWX_/XDPPCompartmentGraphicNameCompartmentIdentifier CTVY _O  X c4f[\_5XDPPCompartmentGraphicAttributesCompartmentIdentifier DkZ] _f  \ wz4}`_a_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships E^b _}  a; <==>?@ABC DEFNPɀteikpf's_{{335, 340.5}, {70, 29}} Wg YZ[\5_hd abc #@ # u wj yz_$1F38AC2C-B07B-4045-947F-CC319F26B0C2 Z_5mnl "A"?"do_XDDoubleArrowsLineEnd]Double Arrows\{335, 369.5} OHA@@A@AA@@AA@#@ Z_5ɀq"A"?"dr\{405, 340.5} ΀O$A@@A@#@ Z45$d Z25$d_{{412, 3}, {128, 75}} Wہwzm Znopr6Pxjy"Cwx z{O0.79 0.63108281 0.679980358wx z{O&0.9299240239 0.8770276033 0.893220054 Z6"?j{wx z{O'0.5266666667 0.4207218733 0.4533202387u w} yz_$046B785B-9778-40CB-BD55-333D9EAAB8A9 ; 6j_/XDPPCompartmentGraphicNameCompartmentIdentifier   _   6j_5XDPPCompartmentGraphicAttributesCompartmentIdentifier ! _   -063j_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships 9 _3  ; <=_{{414, 90}, {128, 75}} GWHIm Znopr7OPPx"Cwx Rz{O&0.9299240239 0.8770276033 0.893220054 ZU7X"?wx Zz{O'0.5266666667 0.4207218733 0.4533202387u ]w yza_$06125917-E6DC-4F89-B905-B33CB035D11E c;def 7p dt _p   7 e _   -07 x _{+  ; <=_{{565, 0}, {128, 75}} Wm Znopr8Px"Cwx z{O&0.9299240239 0.8770276033 0.893220054 Z8"?wx z{O'0.5266666667 0.4207218733 0.4533202387u w yzɀ_$E6DE9B3E-DFAD-4AF5-A879-1D77E834A0EE ;΁ 8؁ ܁x _{+   8  _   -08  x _{+  ; <=_{{214, 432}, {128, 133}} Wm Znopr9 !P#"wx #z{O0.79 0.63108281 0.679980358wx &z{O'0.9299303818 0.8770276033 0.8932184645 Z)9,"?#wx .z{O'0.5266666667 0.4207218733 0.4533202387u 1w yz5_$BD7DB0ED-6323-4117-8DAB-9BAACC510D59 7;89:Ł A9D#_/XDPPCompartmentGraphicNameCompartmentIdentifier Ix _D{+   Y9\€#_5XDPPCompartmentGraphicAttributesCompartmentIdentifier ax _\{Á+   nq9tǁƀ#_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships zx _t{ȁ+  ; <=_{{405, 414}, {128, 116}} Ẃπm Znopr:P6"wx z{O'0.9299303818 0.8770276033 0.8932184645 Z:"?6wx z{O'0.5266666667 0.4207218733 0.4533202387u wҀ yz_$9B48C1F7-E989-4349-B4CF-7B4D3DF462DC ;ԁׁځ݁ A:6 x _{Ձ+   Y:ʁ€6 ΁x _{؁+   nq:ǁƀ6 x _{ہ+   :߁ހ6_ ?iJuiJQ\hY_*f B"vA MBo?sR gh Y Z_NSMutableDictionary Y [k\NSDictionarygh [ ] [k_NSKeyedArchiver ` aTroot"+5:??ERZelsuwy  IKMOQSUWY[]_acegiknprtvx{'2ACEGIKMOQS\^c~ &/8=FO]dr ',8el{   ? A J W \ i r |   Z \ i { }         * / < I K M O |       + 4 7 9 ; L N P R _ a j s | ~  9 ; h j l n p r w | (+-0258;=@MOQS   ?lnprtv{ &/<EZ\ikmo|~  &/8:<EGn$&(*,.38=?ANWln{} !.09BKMOXZ)2_aceginsxz| "$1357dgilnqtwy| !*357@Bi"OQSUWY^chjl  "$\ehjl}$)+-COj#&(+-0368;hjoqsuwy{}   ?lnprtv{ *,.0]`begjmpru  &(*35\.02468=BGIK_ly{1469;>ADFIz|~  1 ^ ` b d f h m r w y { !!!! ! ! !!!!! !4!A!N!P!e!n!{!}!!!!!!!!!!!!!!!!!!!"""""""")"+"4"="F"H"J"S"U"|""""""""""""""###S#\#################$$$$$$$$I$K$M$O$Q$S$U$W$Y$[$]$y$$$$$$$$$$$$$$$$$%%-%/%1%3%5%7%<%A%F%H%J%b%p%}%%%%& &&&&&&&!&&&(&*&7&D&F&&&&&&&&&&&&&&&&&''''6'8':'<'>'@'B'D'F'H'J'f'o'r't'v''''''''''''''(((( ("($()(.(3(5(7(O(](j(w(y((((()))) )))))+)8)E)G)\)e)r)t)v)x)))))))))))))*******!*.*4*A*`*b*d*m*u*z******++++4+@+N+c+h+j+l+n+w+++++++++++,,,*,3,:,<,?,B,E,j,,,,,,,,,,,,,----8-E-S-^-a-c-f-------....".'.).,./.1.4.7.9.<.M.T.].d.m.p.s.v..............///'/*/,/./C/E/H/K/N/X/e/h/j/s/////////0 000)0.0<0a0d0g0j0l0o0q0s0v000000001111 1 111191<1?1B1D1G1I1K1N11111111111111112222$2&2)222F2M2a2l2u2222222222222233383:3O3T3V3X3[3h33333333333333444444"4$4&4)46494;4>4o4z4|4444444444444444444444555555!5$5'5*5,515V5Y5\5_5a5d5f5h5k5x5{5~55555555555555555566666!6&636R6T6a6666666666666667&7/76797<7?7B7g7j7l7o7q7t7v7x7{777777777778888*8-808385888:8<8?8w8888888888888888889999 9D9R9_9b9e9h99999999999999999::::: :::;:=:J:s:u:::::::::::::;;;;";%;(;+;P;S;U;X;Z;];_;a;d;;;;;;;;;;;;;;<<<<<>>>>>(>*>->0>=>?>H>Q>Z>]>_>h>j>>>>>>>>>>>>>??? ?"?m?v??????????????@@@@@ @#@0@2@4@7@O@X@]@`@c@e@~@@@@@@@@@@@AA AAAA!AKAMAVAYA[AdAfAAAAAAAAAAAAAAAABB!B$B'B*BWBYB\B_BaBdBgBiBlBBBBBBBBBBBBBBC!C#C&C)C+C.C1C3C6C[C^CaCdCfCiCkCmCpCCCCCCCCDDDD D DDDDD6D?DDDGDJDLDeDhDjDlDoDtDDDDDDDDDEEEEEEEEFEOEVEYE\E_EbEEEEEEEEEEEEEEEEEEEEEEFFFF!F#F&F(F*F-F:F=F@FCFpFrFuFxFzF}FFFFFFFFFFFFFFFFGGG G GGGGGGG&G)GAGJGOGRGUGWGpGsGuGwGzGGGGGGGGGGHHHHHH(H*HQHZHaHdHgHjHmHHHHHHHHHHHHHHHHHHHHHIII)I,I/I2I4I7I9I;I>IKINIQITIIIIIIIIIIIIIIIIIIIIIIJJJJJ!J#J&J)J,J.J7J:JUJ^JcJfJiJkJJJJJJJJJJJJKKKKKK(KRKTK]K`KbKkKmKKKKKKKKKKKKKKKKLL(L+L-L0LaLcLfLiLlLnLqLtLwLyLLLLLLLLLLLLLMM1M3M6M9MMAMDMGMIMnMqMtMwMyM|M~MMMMMMMMNNNNNNN"N%N(N*N3N6NQNZN_NbNeNgNNNNNNNNNNNNNNNO O"O+O.O0O9O;ObOkOtOwOzO}OOOOOOOOOOOOOOOPPPP P PPPPPP?PBPEPHPJPMPOPQPTPaPdPfPiPPPPPPPPPPPPPPPPPPPPPPQQ2Q4Q7Q:Q=Q?QBQEQHQJQoQrQuQxQzQ}QQQQQQQQQRR R#R&R)R+R.R1R4R6R?RBRKR^RcRvRRRRRRRRRRRRRRRRRRRRRRRRRSSS"S%S(S+S.S1S4S7S:S=S@SCSFSISLSOSRSUSXS[S^SaSdSiSnSsSxS}SSSSSSSSSSSSSSSSSSSSST TTT*T/T4 bT6MediaLibrary.xcdatamodeld/MediaLibrary-2.5.xcdatamodel/000077500000000000000000000000001250533726500232145ustar00rootroot00000000000000MediaLibrary.xcdatamodeld/MediaLibrary-2.5.xcdatamodel/elements000066400000000000000000010602201250533726500247540ustar00rootroot00000000000000bplist00hhX$versionX$objectsY$archiverT$top>456PQRSTUVWXYZuvw}~t !"#'6<=ETU^xyz{|}~ *9HTfghijklm|} .=LP_n}.*>M\kz}      !"#$%&'(=>FRfu-<VW]i}&2FUdsw-<K`aiu   # 2 A P _ n }  * 9 = L [ j y   & ' / ; O ^ m |   % 4 C R g h p |  * 9 H W f u v !0?NZl{#2AETcr -.6BVet,;JYnow1@O^mn} (7FUas)8GKZix23;G[jy"1@O^st| $6ETcr ,;JYew -<KO^m|"78@L`o~ '6ETcxy);JKZix#2AP_k}$3BQUds (=>FRfu   - < K Z i ~  !!!#!/!A!P!Q!`!o!~!!!!!!!!!"""")"8"G"V"e"q""""""""### ##*#9#H#W#[#j#y########$$$$!$-$A$P$S$b$q$$$$$$$$$$$$$$$%%%&%5%D%H%W%f%u%%%%%%%%%& &&/&0&8&D&X&g&v&&&&&&&&&''''.'='L'['p'q'y'''''''''(((!(3(B(Q(`(o(~((((((((()) ))))8)G)V)b)t))))))))))*****9*H*L*[*j*y********+ + +++2+A+D+S+b+q+t++++++++++++++++,,,&,5,9,H,W,f,u,,,,,,,,,- - -!-)-5-I-X-g-v-z--------......=.L.a.b.j.v.........///$/3/B/Q/`/o/~///////////0 00(070C0I0J0Y0b0c0d0h0p0s00000000001 111-1<1K1Z1f1x111111111222&2'2/2;2O2^2m2|222222222333%343C3R3g3h3p3|3333333334 44*494H4W4f4u4444444444555 5/5>5M5Y5k5z555555555566!606?6C6R6a6p666666666777*7+737?7S7b7q77777777778 88)888G8V8k8l8t8888888889999.9=9L9[9j9999999999:::::&:5:6:H:I:J:K:L:M:N:O:d:e:m:y:::::::::; ;;';6;E;T;c;r;;;;;;;;;;;<<<,<;>>'>(>0><>P>_>n>}>>>>>>>>>???&?5?D?S?h?i?q?}?????????@ @@+@:@I@X@g@v@@@@@@@@@@AAA!A0A?ANAZAlA{AAAAAAAAAABB"B1B@BDBSBbBqBBBBBBBBBCCCCC(CBCCCICUCiCxC{CCCCCCCCCCCCCCD D DD!D5DDDSDbDfDuDDDDDDDDDE EE)E8E]M]\]q]r]z]]]]]]]]]^^^"^4^C^R^a^p^^^^^^^^^^__ __*_9_H_W_c_u__________```+`:`I`M`\`k`z````````aaaa4a5a=aIa]ala{aaaaaaaaabbb$b3bBbQb`bubvb~bbbbbbbbbc cc&c8cGcVcectcccccccccccddd-d?@ABC EFGHIJKLMN`րҀ-[ShowEpisodeUAlbumTShowTFile_TrackInformation_SubtitlesTrackInformation_AudioTrackInformationZAlbumTrack_VideoTrackInformationULabel[\]^_` ab "cd%efg&&kl.&fo:frst_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage[_isAbstract55BoWordered78 xzOy{-^XD_PStereotype" % eEyf&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 O "#$').2-_XDPMCompoundIndexes_XD_PSK_elementID_XD_PSK_versionHashModifier_XD_PSK_fetchRequestsArray_XD_PSK_isAbstract_XD_PSK_userInfo_XD_PSK_classMapping_XD_PSK_entityClassName "%{ttt.ttttU_typeX_default\_association[_isReadOnlyY_isStaticY_isUniqueZ_isDerivedZ_isOrdered\_isCompositeW_isLeaf!Z$classnameX$classes_XDUMLPropertyImp_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImpXNSObject "%{ttt.tttt! "%{ttt.tttt! "%{ttt.tttt%!8 &^NSMutableArrayWNSArray "%{ttt.tttt(! "%{ttt.tttt*!78 O+,-_ com.apple.syncservices.DataClass_MediaLibraryFile$%_NSMutableDictionary$&\NSDictionary "%){ttt.tttt/!" %e 78t.01_XDGenericRecordClass>?]XDUMLClassImp@ABCD]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp "%G{ttt.tttt3!]MLShowEpisodeVW_XDUMLStereotypeImpXYZ[\]_XDUMLStereotypeImp]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp78 _kO`abcdefghij6789:;<=>?@lmnopqrstuvAmŁ܁ ف-VunreadUfiles\shortSummary_shouldBeDisplayed]episodeNumber\seasonNumberTshowZartworkURL\lastSyncDateTnameYtheTVDBID  "%&Ett.tft`ttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedCl6BI78 ODEFZ-_XD_PPropStereotype_XD_PAtt_Stereotype" % elf&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageAD4G78 OHIJKLMNOPQRTUWXY-_XD_PPSK_isStoredInTruthFile_XD_PPSK_versionHashModifier_XD_PPSK_userInfo_XD_PPSK_isIndexed_XD_PPSK_isOptional_XD_PPSK_isSpotlightIndexed_XD_PPSK_elementID_XD_PPSK_isTransient "%ttt.tttt(F!H "%ttt.ttttF!I "%ttt.ttttSF!J78 O- "%ttt.tttt(F!K "% ttt.ttttVF!L  "%ttt.tttt(F!M "%ttt.ttttF!N "%ttt.tttt(F!O"I %J eKlf&.tS_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageAE4[78 U]OVWXYZ[\\]^_`ab^_`abcdcefgijk-_XD_PAttK_defaultValueAsString_(XD_PAttK_allowsExternalBinaryDataStorage_XD_PAttK_minValueString_XD_PAttK_attributeType_XD_PAttK_maxValueString_XD_PAttK_valueTransformerName_ XD_PAttK_regularExpressionString "%ottt.tVtttdZ!\RNO "%ttt.tWttt(Z!] "%ttt.tXtttZ!^ "%ttt.tYttthZ!_  "%ttt.tZtttZ!` "%ttt.t[tttZ!a "%ttt.t\tttZ!b]XDPMAttribute]XDPMAttribute\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImp  "%&Ett.tftattt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedo7nB"78 ODpq|-_XD_PR_Stereotype" % emf&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragemD4r78  OHIJKLMNOstuwxyz{- "%ttt.tttt(q!H "%ttt.ttttq!I "%?ttt.ttttvq!J78 MNO- "% ttt.ttttVq!K "% ttt.ttttVq!L "%ttt.tttt(q!M "%ttt.ttttq!N "%ttt.tttt(q!O" % emf&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragemp4}78 O~-_XD_PRK_minCount_XD_PRK_deleteRule_XD_PRK_maxCount_XD_PRK_destination_XD_PRK_isToMany^XD_PRK_ordered_XD_PRK_inverseRelationship "%ttt.tttt|!~ "%ttt.tttt|! "%ttt.tttt|! "%Httt.tttt|!  "%ef && l.&fo=ft_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage  78 Oy-" % e!Hyf&.t)_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 +4O56789:;<- "%ttt.tttt! "%ttt.tttt! "%ttt.tttt! "%mttt.tttt!8 {& "%ttt.tttt(! "%ttt.tttt!78 O,-_com.apple.syncservices.Syncable_ com.apple.syncservices.DataClassRNO "%)ttt.tttt/! "%ttt.tttt!VMLFile78 O `怟6 4Kc{ف5Md|ځ3JaxNe|-Vlabels\lastPositionUtitleSurl]episodeNumberXduration_noOnlineMetaData_lastParsingDate^hasFetchedInfo^lastAudioTrack\shortSummary\seasonNumber_lastSubtitleTrack[releaseYearZartworkURLTtype_thumbnailTimeoutedYplayCount_currentlyWatchingXisOnDiskZalbumTrack]remainingTime_albumTrackNumberVartist_folderTrackNumber[showEpisodeVtracksUgenreUalbum]isBeingParsedVisSafe)* + "%&Htt3.tfttt;t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedu78 ?BODpCD̀-"G %H eIf&.tQ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 S\OHIJKLMNO]^_`abcdÀĀŀǀȀɀʀˀ- "%Cttt.tttt(!H "%Cttt.tttt!I "%Cttt.ttttƀ!J78 O- "% Cttt.ttttV!K "% Cttt.ttttV!L "%Cttt.tttt(!M "%Cttt.tttt!N "%Cttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragep478 O~΀πЀс- "%Dttt.tttt!~ "%Dttt.tttt! "%Dttt.tttt! "%NDttt.ttttҀ!=>?@AB CD "EF%efH&&Ll.&foCfSTt_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorageԁiJ78 XZOy[Հ-"^ %_ e`Nyf&.th_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageҀ478 jsOtuvwxyz{׀؀ـڀ܀݀- "%[ttt.tttt! "%[ttt.tttt! "%[ttt.tttt! "%[ttt.ttttۀ!8 & "%[ttt.tttt(! "%[ttt.ttttހ!78 O܀ߡ,-_ com.apple.syncservices.DataClass "%)[ttt.tttt/! "%[ttt.tttt!WMLLabel78 Oia?7-   "%&Ntt.tftittt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl?ḁ78 "ODE#$-"' %( e)f&.t1_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 3<OHIJKLMNO=>?@ABCD- "%#ttt.tttt(!H "%#ttt.tttt!I "%f#ttt.tttt!J78 tuO- "%#ttt.tttt(!K "%#ttt.tttt(!L "%#ttt.tttt(!M "%#ttt.tttt!N "%#ttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 OVWXYZ[\\]^_`abހ- "%$ttt.tVttt!\XUntitled "%$ttt.tWttt(!] "%$ttt.tXttt!^ "%$ttt.tYttt!_ "%$ttt.tZttt!` "%$ttt.t[ttt!a "%$ttt.t\ttt!bLM N "%&NttV.tftatt^t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered7iJQ78 beODpfg -"j %k elf&.tt_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 vOHIJKLMNO  - "%fttt.tttt(!H "%fttt.tttt!I "%fttt.tttt!J78 O- "% fttt.ttttV!K "%fttt.tttt(!L "%fttt.tttt(!M "%fttt.tttt!N "%fttt.tttt(!O"  %  e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragep4 78  O~      ! - "%gttt.tttt !~ "%gttt.tttt ! "%gttt.tttt ! "%Hgttt.tttt ! "% gttt.ttttV ! "%gttt.tttt( ! "%gttt.tttt ! _XDPMRelationship _XDPMRelationship\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImpZduplicates8 & ZXDPMEntity ZXDPMEntity]XDUMLClassImp_XDUMLClassifierImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp "% Dttt.ttttV! "%Dttt.tttt(! "%Dttt.tttt!  "%&Htt .tfttt t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl78 ODE )-" % e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 OHIJKLMNO        !"$%&'(- "% ttt.tttt(!H "% ttt.tttt!I "% , ttt.tttt#!J78 : ;O- "% ttt.tttt(!K "%  ttt.ttttV!L "% ttt.tttt(!M "% ttt.tttt!N "% ttt.tttt(!O" % e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4*78 OVWXYZ[\\]^_`ab +-./123- "%  ttt.tVttt,)!\Q0 "% ttt.tWttt()!] "% ttt.tXttt)!^ "%  ttt.tYttt0)!_ "% ttt.tZttt)!` "% ttt.t[ttt)!a "% ttt.t\ttt)!b    "%&Htt .tfttt $t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered6l51,78 ( +ODE , -7B-" 0 % 1 e 2f&.t :_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4D4878 < EOHIJKLMNO F G H I J K L M9:;=>?@A- "% ,ttt.tttt(7!H "% ,ttt.tttt7!I "% o ,ttt.tttt<7!J78 } ~O- "% ,ttt.tttt(7!K "%  ,ttt.ttttV7!L "% ,ttt.tttt(7!M "% ,ttt.tttt7!N "% ,ttt.tttt(7!O" % e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4E4C78 OVWXYZ[\\]^_`ab DEFGHIJ- "% -ttt.tVtttB!\ "% -ttt.tWttt(B!] "% -ttt.tXtttB!^ "% -ttt.tYtttB!_ "% -ttt.tZtttB!` "% -ttt.t[tttB!a "% -ttt.t\tttB!b S T U "%&Htt ].tfttt et_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedMlL{fK78 i lODE m nNY-" q % r e sf&.t {_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageKD4O78 } OHIJKLMNO PQRTUVWX- "% mttt.tttt(N!H "% mttt.ttttN!I "%  mttt.ttttSN!J78 O- "% mttt.tttt(N!K "% mttt.tttt(N!L "% mttt.tttt(N!M "% mttt.ttttN!N "% mttt.tttt(N!O" %  e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageKE4Z78  !OVWXYZ[\\]^_`ab " # $ % & ' ([\]^_ab- "% nttt.tVtttY!\ "% nttt.tWttt(Y!] "% nttt.tXtttY!^ "% nttt.tYtttY!_ "% h nttt.tZttt`Y!`T1024 "% nttt.t[tttY!a "% nttt.t\tttY!b  "%&Htt .tfttt t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedeldA$78 ODE fq-" % e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragecD4g78 OHIJKLMNO Ёhijlmnop- "% ttt.tttt(f!H "% ttt.ttttf!I "%  ttt.ttttkf!J78 O- "% ttt.tttt(f!K "%  ttt.ttttVf!L "% ttt.tttt(f!M "% ttt.ttttf!N "% ttt.tttt(f!O"O %P eQf&.tY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragecE4r78 [cOVWXYZ[\\]^_`abdefghijstuvxyz- "%  ttt.tVttt,q!\ "% ttt.tWttt(q!] "% ttt.tXtttq!^ "% ttt.tYtttwq!_d "% ttt.tZtttq!` "% ttt.t[tttq!a "% ttt.t\tttq!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered}l|#78 ODE~-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage{D478  OHIJKLMNO   - "%ttt.tttt(~!H "%ttt.tttt~!I "%4ttt.tttt~!J78 BCO- "%ttt.tttt(~!K "% ttt.ttttV~!L "%ttt.tttt(~!M "%ttt.tttt~!N "%ttt.tttt(~!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage{E478 OVWXYZ[\\]^_`ab- "%ttt.tVttt!\ "%ttt.tWttt(!] "%ttt.tXttt!^ "%ttt.tYttt!_, "%ttt.tZttt!` "%ttt.t[ttt!a "%ttt.t\ttt!b  "%&Htt#.tfttt+t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlsW78 /2ODE34-"7 %8 e9f&.tA_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 CLOHIJKLMNOMNOPQRST- "%3ttt.tttt(!H "%3ttt.tttt!I "%v3ttt.tttt!J78 O- "%3ttt.tttt(!K "% 3ttt.ttttV!L "%3ttt.tttt(!M "%3ttt.tttt!N "%3ttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 OVWXYZ[\\]^_`ab- "%o4ttt.tVtttd!\ "%4ttt.tWttt(!] "%4ttt.tXttt!^ "%4ttt.tYttth!_ "%4ttt.tZttt!` "%4ttt.t[ttt!a "%4ttt.t\ttt!bZ[ \ "%&Httd.tftttlt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl H78 psODEtu-"x %y ezf&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 OHIJKLMNO- "%tttt.tttt(!H "%tttt.tttt!I "%tttt.tttt!J78 O- "%tttt.tttt(!K "% tttt.ttttV!L "%tttt.tttt(!M "%tttt.tttt!N "%tttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478  (OVWXYZ[\\]^_`ab)*+,-./- "%uttt.tVttt!\ "%uttt.tWttt(!] "%uttt.tXttt!^ "%`uttt.tYttt!_ "%uttt.tZttt!` "%uttt.t[ttt!a "%uttt.t\ttt!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlm#78 ODEŁЀ-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage€D478 OHIJKLMNOׁǁȁɁˁ́́΁π- "%ttt.tttt(!H "%ttt.tttt!I "%ttt.ttttʀ!J78 O- "% ttt.ttttV!K "% ttt.ttttV!L "%ttt.tttt(!M "%ttt.tttt!N "%ttt.tttt(!O"V %W eXf&.t`_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage€E478 bjOVWXYZ[\\]^_`abklmnopqҁӁԁՁցׁ؀- "%ottt.tVtttd!\ "%ttt.tWttt(!] "%ttt.tXttt!^ "%ttt.tYttth!_ "%ttt.tZttt!` "%ttt.t[ttt!a "%ttt.t\ttt!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlq78 ODE܁-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـD478 OHIJKLMNOށ߁- "%ttt.tttt(!H "%ttt.tttt!I "%:ttt.tttt!J78 HIO- "%ttt.tttt(!K "% ttt.ttttV!L "%ttt.tttt(!M "%ttt.tttt!N "%ttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـE478 OVWXYZ[\\]^_`ab- "% ttt.tVttt,!\ "%ttt.tWttt(!] "%ttt.tXttt!^ "%ttt.tYtttw!_ "%ttt.tZttt!` "%ttt.t[ttt!a "%ttt.t\ttt!b  "%&Htt(.tfttt0t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl ޘ78 47ODE89-"< %= e>f&.tF_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 HQOHIJKLMNORSTUVWXY- "%8ttt.tttt(!H "%8ttt.tttt!I "%{8ttt.tttt!J78 O- "%8ttt.tttt(!K "% 8ttt.ttttV!L "%8ttt.tttt(!M "%8ttt.tttt!N "%8ttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 OVWXYZ[\\]^_`ab- "%9ttt.tVttt!\ "%9ttt.tWttt(!] "%9ttt.tXttt!^ "%9ttt.tYttt!_ "%9ttt.tZttt!` "%9ttt.t[ttt!a "%9ttt.t\ttt!b_` a "%&Htti.tftttqt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered leY78 uxODEyz -"} %~ ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD4 78 OHIJKLMNO  - "%yttt.tttt( !H "%yttt.tttt !I "%yttt.tttt !J78 O- "%yttt.tttt( !K "% yttt.ttttV !L "%yttt.tttt( !M "%yttt.tttt !N "%yttt.tttt( !O" % ef&.t#_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 %-OVWXYZ[\\]^_`ab./01234- "% zttt.tVttt,!\ "%zttt.tWttt(!] "%zttt.tXttt!^ "%zttt.tYtttw!_ "%zttt.tZttt!` "%zttt.t[ttt!a "%zttt.t\ttt!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered lY78 ODE!,-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD4"78 OHIJKLMNOہ#$%'()*+- "%ttt.tttt(!!H "%ttt.tttt!!I "%ttt.tttt&!!J78   O- "%ttt.tttt(!!K "% ttt.ttttV!!L "%ttt.tttt(!!M "%ttt.tttt!!N "%ttt.tttt(!!O"Z %[ e\f&.td_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4-78 fnOVWXYZ[\\]^_`abopqrstu./01234- "% ttt.tVttt,,!\ "%ttt.tWttt(,!] "%ttt.tXttt,!^ "%ttt.tYtttw,!_ "%ttt.tZttt,!` "%ttt.t[ttt,!a "%ttt.t\ttt,!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered7l67V<78 ODE8C-" % ef&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage5D4978  OHIJKLMNO:;<>?@AB- "%ttt.tttt(8!H "%ttt.tttt8!I "%>ttt.tttt=8!J78 LMO- "%ttt.tttt(8!K "% ttt.ttttV8!L "%ttt.tttt(8!M "%ttt.tttt8!N "%ttt.tttt(8!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage5E4D78 OVWXYZ[\\]^_`abEFGHIKL- "%ttt.tVtttC!\ "%ttt.tWttt(C!] "%ttt.tXtttC!^ "%ttt.tYtttC!_ "%ttt.tZtttJC!`Q4 "%ttt.t[tttC!a "%ttt.t\tttC!b#$ % "%&Htt-.tfttt5t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedOlNQ)78 9<ODE=>P[-"A %B eCf&.tK_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageMD4Q78 MVOHIJKLMNOWXYZ[\]^RSTVWXYZ- "%=ttt.tttt(P!H "%=ttt.ttttP!I "%=ttt.ttttUP!J78 O- "%=ttt.tttt(P!K "% =ttt.ttttVP!L "%=ttt.tttt(P!M "%=ttt.ttttP!N "%=ttt.tttt(P!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageME4\78 OVWXYZ[\\]^_`ab]^_`abc- "% >ttt.tVttt,[!\ "%>ttt.tWttt([!] "%>ttt.tXttt[!^ "%>ttt.tYtttw[!_ "%>ttt.tZttt[!` "%>ttt.t[ttt[!a "%>ttt.t\ttt[!bde f "%&Httn.tftttvt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedfle ]}78 z}ODE~gr-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragedD4h78 OHIJKLMNOijkmnopq- "%~ttt.tttt(g!H "%~ttt.ttttg!I "%~ttt.ttttlg!J78 O- "%~ttt.tttt(g!K "% ~ttt.ttttVg!L "%~ttt.tttt(g!M "%~ttt.ttttg!N "%~ttt.tttt(g!O" % e f&.t(_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragedE4s78 *2OVWXYZ[\\]^_`ab3456789tvwxyz{- "%=ttt.tVtttur!\Umovie "%ttt.tWttt(r!] "%ttt.tXtttr!^ "%ttt.tYtttr!_ "%ttt.tZtttr!` "%ttt.t[tttr!a "%ttt.t\tttr!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered~l}'78 ODE-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage|D478 OHIJKLMNO- "%ttt.tttt(!H "%ttt.tttt!I "%ttt.tttt!J78 O- "%ttt.tttt(!K "% ttt.ttttV!L "%ttt.tttt(!M "%ttt.tttt!N "%ttt.tttt(!O"` %a ebf&.tj_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage|E478 ltOVWXYZ[\\]^_`abuvwxyz{- "%ottt.tVtttd!\ "%ttt.tWttt(!] "%ttt.tXttt!^ "%ttt.tYttth!_ "%ttt.tZttt!` "%ttt.t[ttt!a "%ttt.t\ttt!b  "%&Htt.tftttt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlV|M78 ODE-" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 OHIJKLMNO !"- "%ttt.tttt(!H "%ttt.tttt!I "%Dttt.tttt!J78 RSO- "%ttt.tttt(!K "% ttt.ttttV!L "%ttt.tttt(!M "%ttt.tttt!N "%ttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 OVWXYZ[\\]^_`ab- "% ttt.tVttt,!\ "%ttt.tWttt(!] "%ttt.tXttt!^ "%ttt.tYttt!_ "%ttt.tZttt!` "%ttt.t[ttt!a "%ttt.t\ttt!b)* + "%&Htt3.tfttt;t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl78 ?BODECD-"G %H eIf&.tQ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 S\OHIJKLMNO]^_`abcd- "%Cttt.tttt(!H "%Cttt.tttt!I "%Cttt.tttt!J78 O- "%Cttt.tttt(!K "% Cttt.ttttV!L "%Cttt.tttt(!M "%Cttt.tttt!N "%Cttt.tttt(!O" % ef&.t_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 OVWXYZ[\\]^_`ab- "%oDttt.tVtttd!\ "%Dttt.tWttt(!] "%Dttt.tXttt!^ "%Dttt.tYttth!_ "%Dttt.tZttt!` "%Dttt.t[ttt!a "%Dttt.t\ttt!b j k l "%&Htt t.tfttt |t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlu78 ODE ŁЀ-" % e f&.t _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage€D478 OHIJKLMNO ǁȁɁˁ́́΁π- "% ttt.tttt(!H "% ttt.tttt!I "%  ttt.ttttʀ!J78 O- "% ttt.tttt(!K "%  ttt.ttttV!L "% ttt.tttt(!M "% ttt.tttt!N "% ttt.tttt(!O"!$ %!% e!&f&.t!._!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage€E478 !0!8OVWXYZ[\\]^_`ab!9!:!;!!?ҁԁՁցׁ؁ـ- "%!C ttt.tVtttӀ!\SYES "% ttt.tWttt(!] "% ttt.tXttt!^ "% ttt.tYttth!_ "% ttt.tZttt!` "% ttt.t[ttt!a "% ttt.t\ttt!b!! ! "%&Htt!.tft`tt!t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl6q78 !!ODE!!ǁ݁-"! %! e!f&.t!_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageڀD478 !!OHIJKLMNO!!!!!!!!߁- "%!ttt.tttt(!H "%!ttt.tttt!I "%" !ttt.tttt!J78 ""O- "% !ttt.ttttV!K "% !ttt.ttttV!L "%!ttt.tttt(!M "%!ttt.tttt!N "%!ttt.tttt(!O""f %"g e"hf&.t"p_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageڀE478 "r"zOVWXYZ[\\]^_`ab"{"|"}"~"""- "%!C!ttt.tVtttӀ!\ "%!ttt.tWttt(!] "%!ttt.tXttt!^ "%!ttt.tYttth!_ "%!ttt.tZttt!` "%!ttt.t[ttt!a "%!ttt.t\ttt!b"" " "%&Htt".tfttt"t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered?78 ##ODp##-"# %# e# f&.t#_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 ## OHIJKLMNO#!#"###$#%#&#'#(- "%#ttt.tttt(!H "%#ttt.tttt!I "%#J#ttt.tttt!J78 #X#YO- "% #ttt.ttttV!K "% #ttt.ttttV!L "%#ttt.tttt(!M "%#ttt.tttt!N "%#ttt.tttt(!O"# %# e#f&.t#_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragep478 ##O~#######- "%#ttt.tttt!~ "%#ttt.tttt! "%#ttt.tttt! "%L#ttt.tttt!$$$$$$ $$ "$ $ %ef$ &&$l.&foAf$$t_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorageM78 $$Oy$-"$" %$# e$$Lyf&.t$,_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4 78 $.$7O$8$9$:$;$<$=$>$?   - "%$C$ttt.tttt !8 $Q& "%$ttt.tttt! "%$ttt.tttt! "%$s$ttt.tttt!8 $& "%$ttt.tttt(! "%$$ttt.tttt!78 $$O$$-_ com.apple.syncservices.DataClass_MediaLibraryFile "%)$ttt.tttt/! "%$$ttt.tttt!\MLAlbumTrack78 $$O$a7$$$$$$ց1H_v-[trackNumber$$ $ "%&Ltt$.tft$tt$t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl{9|78 $$ODE$$(-"$ %$ e$$f&.t%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 %% OHIJKLMNO%%%%%%%% !#$%&'- "%$ttt.tttt(!H "%$ttt.tttt!I "%%7$ttt.tttt"!J78 %E%FO- "%$ttt.tttt(!K "% $ttt.ttttV!L "%$ttt.tttt(!M "%$ttt.tttt!N "%$ttt.tttt(!O"% %% e%$f&.t%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4)78 %%OVWXYZ[\\]^_`ab%%%%%%%*+,-./0- "% $ttt.tVttt,(!\ "%$ttt.tWttt((!] "%$ttt.tXttt(!^ "%$ttt.tYtttw(!_ "%$ttt.tZttt(!` "%$ttt.t[ttt(!a "%$ttt.t\ttt(!b&& & "%&Ltt&%.tfttt&-t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered3l2578 &1&4ODE&5&64?-"&9 %&: e&;$f&.t&C_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage1D4578 &E&NOHIJKLMNO&O&P&Q&R&S&T&U&V678:;<=>- "%&5ttt.tttt(4!H "%&5ttt.tttt4!I "%&x&5ttt.tttt94!J78 &&O- "%&5ttt.tttt(4!K "% &5ttt.ttttV4!L "%&5ttt.tttt(4!M "%&5ttt.tttt4!N "%&5ttt.tttt(4!O"& %& e&$f&.t&_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage1E4@78 &&OVWXYZ[\\]^_`ab&&&&&&&ABCDEFG- "%&6ttt.tVttt?!\ "%&6ttt.tWttt(?!] "%&6ttt.tXttt?!^ "%&6ttt.tYttt?!_ "%&6ttt.tZttt?!` "%&6ttt.t[ttt?!a "%&6ttt.t\ttt?!b'\'] '^ "%&Ltt'f.tfttt'nt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedJlIr~78 'r'uODE'v'wKV-"'z %'{ e'|$f&.t'_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageHD4L78 ''OHIJKLMNO''''''''MNOQRSTU- "%'vttt.tttt(K!H "%'vttt.ttttK!I "%''vttt.ttttPK!J78 ''O- "%'vttt.tttt(K!K "% 'vttt.ttttVK!L "%'vttt.tttt(K!M "%'vttt.ttttK!N "%'vttt.tttt(K!O"( %( e($f&.t( _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageHE4W78 ("(*OVWXYZ[\\]^_`ab(+(,(-(.(/(0(1XYZ[\]^- "%'wttt.tVtttV!\ "%'wttt.tWttt(V!] "%'wttt.tXtttV!^ "%'wttt.tYtttV!_ "%'wttt.tZtttV!` "%'wttt.t[tttV!a "%'wttt.t\tttV!b(( ( "%&Ltt(.tftatt(t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordereda7`_78 ((ODp((bm-"( %( e($f&.t(_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage_D4c78 ((OHIJKLMNO((((((((؁defhijkl- "%(ttt.tttt(b!H "%(ttt.ttttb!I "%((ttt.ttttgb!J78 )) O- "% (ttt.ttttVb!K "% (ttt.ttttVb!L "%(ttt.tttt(b!M "%(ttt.ttttb!N "%(ttt.tttt(b!O")W %)X e)Y$f&.t)a_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage_p4n78 )c)kO~)l)m)n)o)p)q)ropqrstu- "%(ttt.ttttm!~ "%(ttt.ttttm! "%(ttt.ttttm! "%H(ttt.ttttm! "% (ttt.ttttVm! "%(ttt.tttt(m! "%(ttt.ttttm!)) ) "%&Ltt).tfttt)t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedxw78 ))ODp))y-") %) e)$f&.t*_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragevD4z78 **OHIJKLMNO********{|}- "%)ttt.tttt(y!H "%)ttt.tttty!I "%*;)ttt.tttt~y!J78 *I*JO- "% )ttt.ttttVy!K "% )ttt.ttttVy!L "%)ttt.tttt(y!M "%)ttt.tttty!N "%)ttt.tttt(y!O"* %* e*$f&.t*_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragevp478 **O~*******- "%)ttt.tttt!~ "%)ttt.tttt! "%)ttt.tttt! "%F)ttt.tttt!****** ** "**%ef*&&+l.&fo;f++ t_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorages78 + +Oy+-"+ %+ e+Fyf&.t+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 ++(O+)+*+++,+-+.+/+0- "%+4+ttt.tttt!8 +B& "%+ttt.tttt! "%+ttt.tttt! "%+d+ttt.tttt!8 +r& "%+ttt.tttt(! "%++ttt.tttt!78 ++O+++-_com.apple.syncservices.Syncable_ com.apple.syncservices.DataClass_MediaLibraryFile "%)+ttt.tttt/! "%++ttt.tttt!WMLAlbum78 ++O+i+?++++Ɓρ-[releaseYear\unreadTracks++ + "%&Ftt+.tfttt+t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered*f78 ++ODp++-"+ %+ e++f&.t+_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 ++OHIJKLMNO+,,,,,,,- "%+ttt.tttt(!H "%+ttt.tttt!I "%,(+ttt.tttt!J78 ,6,7O- "% +ttt.ttttV!K "% +ttt.ttttV!L "%+ttt.tttt(!M "%+ttt.tttt!N "%+ttt.tttt(!O", %, e,+f&.t,_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragep478 ,,O~,,,,,,,- "%+ttt.tttt!~ "%+ttt.tttt! "%+ttt.tttt! "%L+ttt.tttt! "% +ttt.ttttV! "%+ttt.tttt(! "%$+ttt.ttttv!- - - "%&Ftt-.tft+tt-t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl<78 -"-%ODE-&-'ƀ-"-* %-+ e-,+f&.t-4_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 -6-?OHIJKLMNO-@-A-B-C-D-E-F-GÁāŀ- "%-&ttt.tttt(!H "%-&ttt.tttt!I "%-i-&ttt.tttt!J78 -w-xO- "%-&ttt.tttt(!K "% -&ttt.ttttV!L "%-&ttt.tttt(!M "%-&ttt.tttt!N "%-&ttt.tttt(!O"- %- e-+f&.t-_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 --OVWXYZ[\\]^_`ab-------ȁɁʁˁ́́΀- "%-'ttt.tVttt!\ "%-'ttt.tWttt(!] "%-'ttt.tXttt!^ "%-'ttt.tYttt!_ "%-'ttt.tZttt!` "%-'ttt.t[ttt!a "%-'ttt.t\ttt!b.M.N .O "%&Ftt.W.tftitt._t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl?O"N78 .c.fODE.g.hҁ݀-".k %.l e.m+f&.t.u_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageπD478 .w.OHIJKLMNO........ԁՁց؁فځہ܀- "%.gttt.tttt(!H "%.gttt.tttt!I "%..gttt.tttt׀!J78 ..O- "% .gttt.ttttV!K "%.gttt.tttt(!L "%.gttt.tttt(!M "%.gttt.tttt!N "%.gttt.tttt(!O"/ %/ e/ +f&.t/_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageπE478 //OVWXYZ[\\]^_`ab///// /!/"߁- "%.httt.tVttt!\ "%.httt.tWttt(!] "%.httt.tXttt!^ "%.httt.tYttt!_ "%.httt.tZttt!` "%.httt.t[ttt!a "%.httt.t\ttt!b// / "%&Ftt/.tft/+tt/t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedk78 //O/D//-_XD_PFP_Stereotype"/ %/ e/+f&.t/_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 //OHIJKMNO///////ȁ- "%/ttt.tttt(!H "%/ttt.tttt!I "%//ttt.tttt!J78 //O- "%/ttt.tttt(!K "%/ttt.tttt(!M "%/ttt.tttt!N "% /ttt.ttttV!O"08 %09 e0:+/f&.t0B_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 0D0FO0E0G-_XD_PFP_fetchRequestKey "%0L/ttt.t0Ettt!"0Z0[0\ 0]+0_F0a__fetchedProperty__predicateStringW_entity_fetchedPropertyFetchRequest_&album == $FETCH_SOURCE AND unread == 10e0f_XDPMFetchRequest0g_XDPMFetchRequest0i0j_XDPMFetchedProperty0k0l0m0n0o_XDPMFetchedProperty\XDPMProperty_XDUMLPropertyImp_XDUMLNamedElementImp_XDUMLElementImp8 0q& "%)ttt.tttt(! "%)ttt.tttt(! "%+)ttt.tttt!00 0 "%&Ltt0.tfttt0t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl>R78 00ODE00-"0 %0 e0$f&.t0_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 00OHIJKLMNO00000000܁    - "%0ttt.tttt(!H "%0ttt.tttt!I "%00ttt.tttt !J78 1 1 O- "%0ttt.tttt(!K "% 0ttt.ttttV!L "%0ttt.tttt(!M "%0ttt.tttt!N "%0ttt.tttt(!O"1[ %1\ e1]$f&.t1e_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 1g1oOVWXYZ[\\]^_`ab1p1q1r1s1t1u1v- "%0ttt.tVttt!\ "%0ttt.tWttt(!] "%0ttt.tXttt!^ "%0ttt.tYttt!_ "%0ttt.tZttt!` "%0ttt.t[ttt!a "%0ttt.t\ttt!b8 1& "%#ttt.tttt(! "%#ttt.tttt(! "%$#ttt.tttt_!22 2 "%&Htt2.tfttt2$t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl)l78 2(2+ODE2,2-*-"20 %21 e22f&.t2:_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD4 78 2<2EOHIJKLMNO2F2G2H2I2J2K2L2M!"#%&'()- "%2,ttt.tttt(!H "%2,ttt.tttt!I "%2o2,ttt.tttt$!J78 2}2~O- "%2,ttt.tttt(!K "% 2,ttt.ttttV!L "%2,ttt.tttt(!M "%2,ttt.tttt!N "%2,ttt.tttt(!O"2 %2 e2f&.t2_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4+78 22OVWXYZ[\\]^_`ab2222222,-./012- "% 2-ttt.tVttt,*!\ "%2-ttt.tWttt(*!] "%2-ttt.tXttt*!^ "%2-ttt.tYttt*!_ "%2-ttt.tZttt*!` "%2-ttt.t[ttt*!a "%2-ttt.t\ttt*!b3S3T 3U "%&Htt3].tfttt3et_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered5l4>78 3i3lODE3m3n6A-"3q %3r e3sf&.t3{_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage3D4778 3}3OHIJKLMNO3333333389:<=>?@- "%3mttt.tttt(6!H "%3mttt.tttt6!I "%33mttt.tttt;6!J78 33O- "%3mttt.tttt(6!K "% 3mttt.ttttV6!L "%3mttt.tttt(6!M "%3mttt.tttt6!N "%3mttt.tttt(6!O"4 %4 e4f&.t4_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage3E4B78 44!OVWXYZ[\\]^_`ab4"4#4$4%4&4'4(CDEFGHI- "% 3nttt.tVttt,A!\ "%3nttt.tWttt(A!] "%3nttt.tXtttA!^ "%3nttt.tYtttwA!_ "%3nttt.tZtttA!` "%3nttt.t[tttA!a "%3nttt.t\tttA!b44 4 "%&Htt4.tfttt4t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedLlKUN\A78 44ODE44MX-"4 %4 e4f&.t4_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageJD4N78 44OHIJKLMNO44444444ρOPQSTUVW- "%4ttt.tttt(M!H "%4ttt.ttttM!I "%44ttt.ttttRM!J78 45O- "%4ttt.tttt(M!K "% 4ttt.ttttVM!L "%4ttt.tttt(M!M "%4ttt.ttttM!N "%4ttt.tttt(M!O"5N %5O e5Pf&.t5X_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageJE4Y78 5Z5bOVWXYZ[\\]^_`ab5c5d5e5f5g5h5iZ[\]^_`- "%4ttt.tVtttX!\ "%4ttt.tWttt(X!] "%4ttt.tXtttX!^ "%4ttt.tYtttX!_ "%4ttt.tZtttX!` "%4ttt.t[tttX!a "%4ttt.t\tttX!b55 5 "%&Htt5.tfttt5t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedclbI~\ 78 55ODE55do-"5 %5 e5f&.t5_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageaD4e78 56OHIJKLMNO6 6 6 6 6 666fghjklmn- "%5ttt.tttt(d!H "%5ttt.ttttd!I "%625ttt.ttttid!J78 6@6AO- "%5ttt.tttt(d!K "% 5ttt.ttttVd!L "%5ttt.tttt(d!M "%5ttt.ttttd!N "%5ttt.tttt(d!O"6 %6 e6f&.t6_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageaE4p78 66OVWXYZ[\\]^_`ab6666666qrstuvw- "% 5ttt.tVttt,o!\ "%5ttt.tWttt(o!] "%5ttt.tXttto!^ "%5ttt.tYtttwo!_ "%5ttt.tZttto!` "%5ttt.t[ttto!a "%5ttt.t\ttto!b77 7 "%&Htt7 .tfttt7(t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedzyA78 7,7/ODp7071{-"74 %75 e76f&.t7>_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragexD4|78 7@7IOHIJKLMNO7J7K7L7M7N7O7P7Q}~- "%70ttt.tttt({!H "%70ttt.tttt{!I "%7s70ttt.tttt{!J78 77O- "% 70ttt.ttttV{!K "% 70ttt.ttttV{!L "%70ttt.tttt({!M "%70ttt.tttt{!N "%70ttt.tttt({!O"7 %7 e7f&.t7_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragexp478 77O~7777777- "%71ttt.tttt!~ "%71ttt.tttt! "%71ttt.tttt! "%E71ttt.tttt! "%71ttt.tttt(! "%71ttt.tttt(! "%m71ttt.ttttm!8W8X 8Y "%&Htt8a.tfttt8it_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered78 8m8pODp8q8r-"8u %8v e8wf&.t8_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 88OHIJKLMNO88888888- "%8qttt.tttt(!H "%8qttt.tttt!I "%88qttt.tttt!J78 88O- "% 8qttt.ttttV!K "% 8qttt.ttttV!L "%8qttt.tttt(!M "%8qttt.tttt!N "%8qttt.tttt(!O"9 %9 e9f&.t9_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstoragep478 99%O~9&9'9(9)9*9+9,KLM- "%8rttt.tttt!~ "%8rttt.tttt! "%8rttt.tttt! "%I8rttt.tttt!e9k9l9m9n9o9p 9q"9r%9s9t9u9v9w9x ff9|&lfo&>99&&f99l._!XDBucketForOwnedAttributesordered_!XDBucketForSpecializationsordered_XDBucketForStereotypesstorage_$XDBucketForOwnedAttributeswasEncoded_$XDBucketForGeneralizationsduplicates_XDBucketForStereotypesordered_$XDBucketForGeneralizationswasEncoded_!XDBucketForGeneralizationsstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForSpecializationswasEncoded_!XDBucketForGeneralizationsordered_!XDBucketForOwnedAttributesstorage_!XDBucketForSpecializationsstorage_$XDBucketForSpecializationsduplicates  ]^78 99Oy9-"9 %9 e9Iyf&.t9_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 99O99999999- "%9ttt.tttt! "%9ttt.tttt! "%9ttt.tttt! "%99ttt.tttt!8 9& "% 9ttt.ttttV! "%:9ttt.tttt!78 ::O:,-_ com.apple.syncservices.DataClass "%)9ttt.tttt/! "%:(9ttt.tttt!_NSManagedObject78 :7:?O:8:9:::;:<:=:>:@:A:B:C:D:E:FӁ/F-[codecFourCCTfileUcodecXlanguageWbitrate\codecProfileZcodecLevel:P:Q :R "%&Itt:Z.tft:8tt:bt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl*˖78 :f:iODE:j:kʀ-":n %:o e:p:@f&.t:x_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 :z:OHIJKLMNO::::::::ÁŁƁǁȁɀ- "%:jttt.tttt(!H "%:jttt.tttt!I "%::jttt.ttttĀ!J78 ::O- "%:jttt.tttt(!K "% :jttt.ttttV!L "%:jttt.tttt(!M "%:jttt.tttt!N "%:jttt.tttt(!O"; %; e; :@f&.t;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 ;;OVWXYZ[\\]^_`ab;; ;!;";#;$;%́́΁ρЁсҀ- "% :kttt.tVttt,!\ "%:kttt.tWttt(!] "%:kttt.tXttt!^ "%:kttt.tYtttw!_ "%:kttt.tZttt!` "%:kttt.t[ttt!a "%:kttt.t\ttt!b;; ; "%&Itt;.tft:9tt;t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedR 78 ;;ODp;;ց-"; %; e;:Af&.t;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageӀD478 ;;OHIJKLMNO;;;;;;;;́؁فځ܁݁ށ߁- "%;ttt.tttt(!H "%;ttt.tttt!I "%;;ttt.ttttۀ!J78 ;;O- "% ;ttt.ttttV!K "% ;ttt.ttttV!L "%;ttt.tttt(!M "%;ttt.tttt!N "%;ttt.tttt(!O"O- "%<ttt.tttt(!K "% <ttt.ttttV!L "%<ttt.tttt(!M "%<ttt.tttt!N "%<ttt.tttt(!O"= %= e=:Bf&.t=_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 ==OVWXYZ[\\]^_`ab=======- "%<ttt.tVttt!\ "%<ttt.tWttt(!] "%<ttt.tXttt!^ "%<ttt.tYttt!_ "%<ttt.tZttt!` "%<ttt.t[ttt!a "%<ttt.t\ttt!b>> > "%&Itt>.tft:;tt>%t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlY:78 >)>,ODE>->.-">1 %>2 e>3:Cf&.t>;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 >=>FOHIJKLMNO>G>H>I>J>K>L>M>N    - "%>-ttt.tttt(!H "%>-ttt.tttt!I "%>p>-ttt.tttt !J78 >~>O- "%>-ttt.tttt(!K "% >-ttt.ttttV!L "%>-ttt.tttt(!M "%>-ttt.tttt!N "%>-ttt.tttt(!O"> %> e>:Cf&.t>_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 >>OVWXYZ[\\]^_`ab>>>>>>>- "%>.ttt.tVttt!\ "%>.ttt.tWttt(!] "%>.ttt.tXttt!^ "%>.ttt.tYttt!_ "%>.ttt.tZttt!` "%>.ttt.t[ttt!a "%>.ttt.t\ttt!b?T?U ?V "%&Itt?^.tft:<tt?ft_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlQ78 ?j?mODE?n?o&-"?r %?s e?t:Df&.t?|_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 ?~?OHIJKLMNO????????!"#$%- "%?nttt.tttt(!H "%?nttt.tttt!I "%??nttt.tttt !J78 ??O- "%?nttt.tttt(!K "% ?nttt.ttttV!L "%?nttt.tttt(!M "%?nttt.tttt!N "%?nttt.tttt(!O"@ %@ e@:Df&.t@_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4'78 @@"OVWXYZ[\\]^_`ab@#@$@%@&@'@(@)()*+,-.- "% ?ottt.tVttt,&!\ "%?ottt.tWttt(&!] "%?ottt.tXttt&!^ "%?ottt.tYttt&!_ "%?ottt.tZttt&!` "%?ottt.t[ttt&!a "%?ottt.t\ttt&!b@@ @ "%&Itt@.tft:=tt@t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered1l02D78 @@ODE@@2=-"@ %@ e@:Ef&.t@_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage/D4378 @@OHIJKLMNO@@@@@@@@Ё45689:;<- "%@ttt.tttt(2!H "%@ttt.tttt2!I "%@@ttt.tttt72!J78 AAO- "%@ttt.tttt(2!K "% @ttt.ttttV2!L "%@ttt.tttt(2!M "%@ttt.tttt2!N "%@ttt.tttt(2!O"AO %AP eAQ:Ef&.tAY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage/E4>78 A[AcOVWXYZ[\\]^_`abAdAeAfAgAhAiAj?@ABCDE- "% @ttt.tVttt,=!\ "%@ttt.tWttt(=!] "%@ttt.tXttt=!^ "%@ttt.tYttt=!_ "%@ttt.tZttt=!` "%@ttt.t[ttt=!a "%@ttt.t\ttt=!bAA A "%&IttA.tft:>ttAt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedHlGT 78 AAODEAAIT-"A %A eA:Ff&.tA_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageFD4J78 BB OHIJKLMNOB B B B BBBBKLMOPQRS- "%Attt.tttt(I!H "%Attt.ttttI!I "%B3Attt.ttttNI!J78 BABBO- "%Attt.tttt(I!K "% Attt.ttttVI!L "%Attt.tttt(I!M "%Attt.ttttI!N "%Attt.tttt(I!O"B %B eB:Ff&.tB_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageFE4U78 BBOVWXYZ[\\]^_`abBBBBBBBVWXYZ[\- "% Attt.tVttt,T!\ "%Attt.tWttt(T!] "%Attt.tXtttT!^ "%Attt.tYtttT!_ "%Attt.tZtttT!` "%Attt.t[tttT!a "%Attt.t\tttT!b8 C&8 CCCC_Հ& "C %C! C"JJC&I.Y_specificX_general``C)C*C+C,C-C. C/C0 "C1C2%efC4&&C8l.&fo?fC?C@t_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstoragesb aEw78 CDCFOyCGc-"CJ %CK eCLJyf&.tCT_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage`4d78 CVC_OC`CaCbCcCdCeCfCgeghiklpq- "%CkCGttt.ttttfc!8 Cy& "%CGttt.ttttc! "%CGttt.ttttc! "%CCGttt.ttttjc!8 C& "%CGttt.tttt(c! "%CCGttt.ttttmc!78 CCOCˁnĆo-_ com.apple.syncservices.DataClass_MediaLibraryFile "%)CGttt.tttt/c! "%CCGttt.ttttrc!_NSManagedObject78 CCOCtCu-\textEncodingCC C "%&JttD.tftCttD t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered`wltvBi778 DDODEDDx-"D %D eDCf&.tD _!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageuD4y78 D"D+OHIJKLMNOD,D-D.D/D0D1D2D3z{|~- "%Dttt.tttt(x!H "%Dttt.ttttx!I "%DUDttt.tttt}x!J78 DcDdO- "%Dttt.tttt(x!K "% Dttt.ttttVx!L "%Dttt.tttt(x!M "%Dttt.ttttx!N "%Dttt.tttt(x!O"D %D eDCf&.tD_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageuE478 DDOVWXYZ[\\]^_`abDDDDDDD́- "%Dttt.tVttt!\ "%Dttt.tWttt(!] "%Dttt.tXttt!^ "%Dttt.tYttt!_ "%Dttt.tZttt!` "%Dttt.t[ttt!a "%Dttt.t\ttt!b8 E9C_&|DE>E?_XDUMLGeneralizationImpE@EAEB_XDUMLGeneralizationImp_XDUMLNamedElementImp_XDUMLElementImp "C %C! C"KKEHI.ԁEKELEMENEOEP EQER "ESET%efEV&&EZl.&fo@fEaEbt_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage Ӂ78 EfEhOyEi-"El %Em eEnKyf&.tEv_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage478 ExEOEEEEEEEE- "%Eittt.tttt! "%Eittt.tttt! "%Eittt.tttt! "%EEittt.tttt!8 E& "%Eittt.tttt(! "%EEittt.tttt!78 EEOEE-_ com.apple.syncservices.DataClass_MediaLibraryFile "%)Eittt.tttt/! "%FEittt.tttt!_NSManagedObject78 FFOFFFF-^channelsNumberZsampleRateFF F "%&KttF$.tftFttF,t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedld78 F0F3ODEF4F5-"F8 %F9 eF:Ff&.tFB_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 FDFMOHIJKLMNOFNFOFPFQFRFSFTFU- "%F4ttt.tttt(!H "%F4ttt.tttt!I "%FwF4ttt.tttt!J78 FFO- "%F4ttt.tttt(!K "% F4ttt.ttttV!L "%F4ttt.tttt(!M "%F4ttt.tttt!N "%F4ttt.tttt(!O"F %F eFFf&.tF_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 FFOVWXYZ[\\]^_`abFFFFFFF- "% F5ttt.tVttt,!\ "%F5ttt.tWttt(!] "%F5ttt.tXttt!^ "%F5ttt.tYttt!_ "%F5ttt.tZttt!` "%F5ttt.t[ttt!a "%F5ttt.t\ttt!bG[G\ G] "%&KttGe.tftFttGmt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl78 GqGtODEGuGvʀ-"Gy %Gz eG{Ff&.tG_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 GGOHIJKLMNOGGGGGGGGÁŁƁǁȁɀ- "%Guttt.tttt(!H "%Guttt.tttt!I "%GGuttt.ttttĀ!J78 GGO- "%Guttt.tttt(!K "% Guttt.ttttV!L "%Guttt.tttt(!M "%Guttt.tttt!N "%Guttt.tttt(!O"H %H eHFf&.tH_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 H!H)OVWXYZ[\\]^_`abH*H+H,H-H.H/H0́́΁ρЁсҀ- "% Gvttt.tVttt,!\ "%Gvttt.tWttt(!] "%Gvttt.tXttt!^ "%Gvttt.tYttt!_ "%Gvttt.tZttt!` "%Gvttt.t[ttt!a "%Gvttt.t\ttt!b8 HC&h "C %C! C"MMHI.ցցJHHHHHH HH "HH%efH&&Hl.&foBfHHt_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage؁I78 HHOyHƁـ-"H %H eHMyf&.tH_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageր478 HHOHHHHHHHHہ܁݁ށ- "%Httt.tttt! "%Httt.tttt! "%Httt.tttt! "%IHttt.tttt߀!8 I%& "%Httt.tttt(! "%I8Httt.tttt!78 IFIHOIGII-_ com.apple.syncservices.DataClass_MediaLibraryFile "%)Httt.tttt/! "%I^Httt.tttt!_NSManagedObject78 ImIrOInIoIpIqIsItIuIv2-YframerateUwidthVheight_framerateDenominatorI}I~ I "%&MttI.tftInttIt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl6Wg78 IIODEII-"I %I eIIsf&.tI_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 IIOHIJKLMNOIIIIIIII- "%Ittt.tttt(!H "%Ittt.tttt!I "%IIttt.tttt!J78 IIO- "%Ittt.tttt(!K "% Ittt.ttttV!L "%Ittt.tttt(!M "%Ittt.tttt!N "%Ittt.tttt(!O"J7 %J8 eJ9Isf&.tJA_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 JCJKOVWXYZ[\\]^_`abJLJMJNJOJPJQJR- "% Ittt.tVttt,!\ "%Ittt.tWttt(!] "%Ittt.tXttt!^ "%Ittt.tYttt!_ "%Ittt.tZttt!` "%Ittt.t[ttt!a "%Ittt.t\ttt!bJJ J "%&MttJ.tftIottJt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlҝ78 JJODEJJف-"J %J eJItf&.tJ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 JJOHIJKLMNOJJJJJJJJ    - "%Jttt.tttt(!H "%Jttt.tttt!I "%KJttt.tttt !J78 K)K*O- "%Jttt.tttt(!K "% Jttt.ttttV!L "%Jttt.tttt(!M "%Jttt.tttt!N "%Jttt.tttt(!O"Kx %Ky eKzItf&.tK_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 KKOVWXYZ[\\]^_`abKKKKKKK- "% Jttt.tVttt,!\ "%Jttt.tWttt(!] "%Jttt.tXttt!^ "%Jttt.tYttt!_ "%Jttt.tZttt!` "%Jttt.t[ttt!a "%Jttt.t\ttt!bKL L "%&MttL .tftIpttLt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl;878 LLODELL)-"L %L eLIuf&.tL'_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 L)L2OHIJKLMNOL3L4L5L6L7L8L9L: !"$%&'(- "%Lttt.tttt(!H "%Lttt.tttt!I "%L\Lttt.tttt#!J78 LjLkO- "%Lttt.tttt(!K "% Lttt.ttttV!L "%Lttt.tttt(!M "%Lttt.tttt!N "%Lttt.tttt(!O"L %L eLIuf&.tL_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4*78 LLOVWXYZ[\\]^_`abLLLLLLLԁ+,-./01- "% Lttt.tVttt,)!\ "%Lttt.tWttt()!] "%Lttt.tXttt)!^ "%Lttt.tYttt)!_ "%Lttt.tZttt)!` "%Lttt.t[ttt)!a "%Lttt.t\ttt)!bM@MA MB "%&MttMJ.tftIqttMRt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered4l378 MVMYODEMZM[5@-"M^ %M_ eM`Ivf&.tMh_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2D4678 MjMsOHIJKLMNOMtMuMvMwMxMyMzM{789;<=>?- "%MZttt.tttt(5!H "%MZttt.tttt5!I "%MMZttt.tttt:5!J78 MMO- "%MZttt.tttt(5!K "% MZttt.ttttV5!L "%MZttt.tttt(5!M "%MZttt.tttt5!N "%MZttt.tttt(5!O"M %M eMIvf&.tN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage2E4A78 NNOVWXYZ[\\]^_`abNNNNNNNBCDEFGH- "% M[ttt.tVttt,@!\ "%M[ttt.tWttt(@!] "%M[ttt.tXttt@!^ "%M[ttt.tYttt@!_ "%M[ttt.tZttt@!` "%M[ttt.t[ttt@!a "%M[ttt.t\ttt@!b8 NCՀ&\ "% 8rttt.ttttV! "%8rttt.tttt(! "%:A8rttt.ttttӀ!NN N "%&HttN.tftttNt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedPlOjt78 NNODENN΁Q\-"N %N eNf&.tN_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageND4R78 NNOHIJKLMNONNNNNNNNSTUWXYZ[- "%Nttt.tttt(Q!H "%Nttt.ttttQ!I "%ONttt.ttttVQ!J78 OOO- "%Nttt.tttt(Q!K "% Nttt.ttttVQ!L "%Nttt.tttt(Q!M "%Nttt.ttttQ!N "%Nttt.tttt(Q!O"Om %On eOof&.tOw_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageNE4]78 OyOOVWXYZ[\\]^_`abOOOOOOO^_`abcd- "%Nttt.tVttt\!\ "%Nttt.tWttt(\!] "%Nttt.tXttt\!^ "%Nttt.tYttt\!_ "%Nttt.tZttt\!` "%Nttt.t[ttt\!a "%Nttt.t\ttt\!bOO O "%&HttO.tftttPt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedglfZ}r78 P P ODEPPhs-"P %P ePf&.tP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageeD4i78 PP'OHIJKLMNOP(P)P*P+P,P-P.P/jklnopqr- "%Pttt.tttt(h!H "%Pttt.tttth!I "%PQPttt.ttttmh!J78 P_P`O- "%Pttt.tttt(h!K "% Pttt.ttttVh!L "%Pttt.tttt(h!M "%Pttt.tttth!N "%Pttt.tttt(h!O"P %P ePf&.tP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageeE4t78 PPOVWXYZ[\\]^_`abPPPPPPPɁuvwxyz{- "%Pttt.tVttts!\ "%Pttt.tWttt(s!] "%Pttt.tXttts!^ "%Pttt.tYttts!_ "%Pttt.tZttts!` "%Pttt.t[ttts!a "%Pttt.t\ttts!bQ5Q6 Q7 "%&HttQ?.tftttQGt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered~l}{(ݐ78 QKQNODEQOQP-"QS %QT eQUf&.tQ]_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage|D478 Q_QhOHIJKLMNOQiQjQkQlQmQnQoQp- "%QOttt.tttt(!H "%QOttt.tttt!I "%QQOttt.tttt!J78 QQO- "%QOttt.tttt(!K "% QOttt.ttttV!L "%QOttt.tttt(!M "%QOttt.tttt!N "%QOttt.tttt(!O"Q %Q eQf&.tQ_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage|E478 QROVWXYZ[\\]^_`abRRRRRR R - "%oQPttt.tVtttd!\ "%QPttt.tWttt(!] "%QPttt.tXttt!^ "%QPttt.tYttth!_ "%QPttt.tZttt!` "%QPttt.t[ttt!a "%QPttt.t\ttt!bRvRw Rx "%&HttR.tftttRt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedlnj78 RRODERR-"R %R eRf&.tR_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 RROHIJKLMNORRRRRRRR- "%Rttt.tttt(!H "%Rttt.tttt!I "%RRttt.tttt!J78 RRO- "%Rttt.tttt(!K "% Rttt.ttttV!L "%Rttt.tttt(!M "%Rttt.tttt!N "%Rttt.tttt(!O"S0 %S1 eS2f&.tS:_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 SUAODEUBUCȁӀ-"UF %UG eUHof&.tUP_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageŀD478 URU[OHIJKLMNOU\U]U^U_U`UaUbUcʁˁ́΁ρЁсҀ- "%UBttt.tttt(!H "%UBttt.tttt!I "%UUBttt.tttt̀!J78 UUO- "%UBttt.tttt(!K "% UBttt.ttttV!L "%UBttt.tttt(!M "%UBttt.tttt!N "%UBttt.tttt(!O"U %U eUof&.tU_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageŀE478 UUOVWXYZ[\\]^_`abUUUUUUUՁցׁ؁فځۀ- "%oUCttt.tVtttd!\ "%UCttt.tWttt(!] "%UCttt.tXttt!^ "%UCttt.tYttth!_ "%UCttt.tZttt!` "%UCttt.t[ttt!a "%UCttt.t\ttt!bViVj Vk "%&EttVs.tftdttV{t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl:R78 VVODEVV߁-"V %V eVpf&.tV_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage܀D478 VVOHIJKLMNOVVVVVVVV- "%Vttt.tttt(!H "%Vttt.tttt!I "%VVttt.tttt!J78 VVO- "%Vttt.tttt(!K "% Vttt.ttttV!L "%Vttt.tttt(!M "%Vttt.tttt!N "%Vttt.tttt(!O"W# %W$ eW%pf&.tW-_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage܀E478 W/W7OVWXYZ[\\]^_`abW8W9W:W;W- "% Vttt.tVttt,!\ "%Vttt.tWttt(!] "%Vttt.tXttt!^ "%Vttt.tYtttw!_ "%Vttt.tZttt!` "%Vttt.t[ttt!a "%Vttt.t\ttt!bWW W "%&EttW.tftettWt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl; >78 WWODEWWŁ-"W %W eWqf&.tW_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 WWOHIJKLMNOWWWWWWWW- "%Wttt.tttt(!H "%Wttt.tttt!I "%XWttt.tttt!J78 XXO- "%Wttt.tttt(!K "% Wttt.ttttV!L "%Wttt.tttt(!M "%Wttt.tttt!N "%Wttt.tttt(!O"Xd %Xe eXfqf&.tXn_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 XpXxOVWXYZ[\\]^_`abXyXzX{X|X}X~X - "% Wttt.tVttt,!\ "%Wttt.tWttt(!] "%Wttt.tXttt!^ "%Wttt.tYtttw!_ "%Wttt.tZttt!` "%Wttt.t[ttt!a "%Wttt.t\ttt!bXX X "%&EttX.tftfttXt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered < Y78 YYODpYY -"Y %Y eY rf&.tY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage D478 YYOHIJKLMNOYY Y!Y"Y#Y$Y%Y&- "%Yttt.tttt( !H "%Yttt.tttt !I "%YHYttt.tttt !J78 YVYWO- "% Yttt.ttttV !K "% Yttt.ttttV !L "%Yttt.tttt( !M "%Yttt.tttt !N "%Yttt.tttt( !O"Y %Y eYrf&.tY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage p478 YYO~YYYYYYYցׁ؀- "%Yttt.tttt!~ "%Yttt.tttt! "%Yttt.tttt! "%GYttt.tttt!YZZZZZ ZZ "ZZ%efZ &&Zl.&fo<fZZt_!XDBucketForOwnedAttributesordered_!XDBucketForOwnedAttributesstorage_ XDBucketForStereotypeswasEncoded_$XDBucketForOwnedAttributeswasEncoded_XDBucketForStereotypesstorage_$XDBucketForGeneralizationsduplicates_$XDBucketForGeneralizationswasEncoded_XDBucketForStereotypesordered_!XDBucketForGeneralizationsordered_!XDBucketForGeneralizationsstorage.  Ձ 78 ZZOyZ!-"Z %Z! eZ"Gyf&.tZ*_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4"78 Z,Z5OZ6Z7Z8Z9Z:Z;Z?@A- "%Zttt.tttt(7!H "%Zttt.tttt7!I "%[8Zttt.tttt<7!J78 [F[GO- "%Zttt.tttt(7!K "% Zttt.ttttV7!L "%Zttt.tttt(7!M "%Zttt.tttt7!N "%Zttt.tttt(7!O"[ %[ e[Zf&.t[_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorage4E4C78 [[OVWXYZ[\\]^_`ab[[[[[[[DEFGHIJ- "%Zttt.tVtttB!\ "%Zttt.tWttt(B!] "%Zttt.tXtttB!^ "%Zttt.tYtttB!_ "%Zttt.tZtttB!` "%Zttt.t[tttB!a "%Zttt.t\tttB!b\\ \ "%&Gtt\&.tftZtt\.t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedMl/LZՃ78 \2\5ODE\6\7NY-"\: %\; e\ %a? ea@Zf&.taH_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 aJaSOHIJKLMNOaTaUaVaWaXaYaZa[- "%a:ttt.tttt(!H "%a:ttt.tttt!I "%a}a:ttt.tttt!J78 aaO- "% a:ttt.ttttV!K "%a:ttt.tttt(!L "%a:ttt.tttt(!M "%a:ttt.tttt!N "%a:ttt.tttt(!O"a %a eaZf&.ta_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 aaOVWXYZ[\\]^_`abaaaaaaa- "%a;ttt.tVttt!\ "%a;ttt.tWttt(!] "%a;ttt.tXttt!^ "%a;ttt.tYttt!_ "%a;ttt.tZttt!` "%a;ttt.t[ttt!a "%a;ttt.t\ttt!bbabb bc "%&Gttbk.tftZttbst_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl3O78 bwbzODEb{b|̀-"b %b ebZf&.tb_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 bbOHIJKLMNObbbbbbbbÁāŁǁȁɁʁˀ- "%b{ttt.tttt(!H "%b{ttt.tttt!I "%bb{ttt.ttttƀ!J78 bbO- "%b{ttt.tttt(!K "% b{ttt.ttttV!L "%b{ttt.tttt(!M "%b{ttt.tttt!N "%b{ttt.tttt(!O"c %c ecZf&.tc%_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 c'c/OVWXYZ[\\]^_`abc0c1c2c3c4c5c6΁ρЁсҁӁԀ- "%b|ttt.tVttt!\ "%b|ttt.tWttt(!] "%b|ttt.tXttt!^ "%b|ttt.tYttt!_ "%b|ttt.tZtttJ!` "%b|ttt.t[ttt!a "%b|ttt.t\ttt!b8 c& "%Yttt.tttt(! "%Yttt.tttt(! "%ZYttt.ttttb!cc c "%&Ettc.tftgttct_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl=3i78 ccODEcc܁-"c %c ecsf&.tc_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـD478 cdOHIJKLMNOdddd d d d d ށ߁- "%cttt.tttt(!H "%cttt.tttt!I "%d/cttt.tttt!J78 d=d>O- "% cttt.ttttV!K "% cttt.ttttV!L "%cttt.tttt(!M "%cttt.tttt!N "%cttt.tttt(!O"d %d edsf&.td_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageـE478 ddOVWXYZ[\\]^_`abddddddd- "%cttt.tVttt!\ "%cttt.tWttt(!] "%cttt.tXttt!^ "%cttt.tYttt!_ "%cttt.tZttt!` "%cttt.t[ttt!a "%cttt.t\ttt!bee e "%&Ette.tfthtte%t_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesorderedl>yd78 e)e,ODEe-e.-"e1 %e2 ee3tf&.te;_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD478 e=eFOHIJKLMNOeGeHeIeJeKeLeMeN- "%e-ttt.tttt(!H "%e-ttt.tttt!I "%epe-ttt.tttt!J78 e~eO- "%e-ttt.tttt(!K "% e-ttt.ttttV!L "%e-ttt.tttt(!M "%e-ttt.tttt!N "%e-ttt.tttt(!O"e %e eetf&.te_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 eeOVWXYZ[\\]^_`abeeeeeee- "% e.ttt.tVttt,!\ "%e.ttt.tWttt(!] "%e.ttt.tXttt!^ "%e.ttt.tYttt!_ "%e.ttt.tZttt!` "%e.ttt.t[ttt!a "%e.ttt.t\ttt!bfTfU fV "%&Ettf^.tftittfft_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered l?;=78 fjfmODEfnfo -"fr %fs eftuf&.tf|_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD4 78 f~fOHIJKLMNOffffffff  - "%fnttt.tttt( !H "%fnttt.tttt !I "%ffnttt.tttt !J78 ffO- "%fnttt.tttt( !K "% fnttt.ttttV !L "%fnttt.tttt( !M "%fnttt.tttt !N "%fnttt.tttt( !O"g %g eguf&.tg_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE478 gg"OVWXYZ[\\]^_`abg#g$g%g&g'g(g)- "%fottt.tVttt!\ "%fottt.tWttt(!] "%fottt.tXttt!^ "%fottt.tYttt!_ "%fottt.tZttt!` "%fottt.t[ttt!a "%fottt.t\ttt!bgg g "%&Ettg.tftjttgt_ XDBucketForStereotypeswasEncoded_XDBucketForStereotypesstorage_XDBucketForStereotypesordered l@|%p"78 ggODEgg!,-"g %g egvf&.tg_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageD4"78 ggOHIJKLMNOggggggggЁ#$%'()*+- "%gttt.tttt(!!H "%gttt.tttt!!I "%ggttt.tttt&!!J78 hhO- "%gttt.tttt(!!K "% gttt.ttttV!!L "%gttt.tttt(!!M "%gttt.tttt!!N "%gttt.tttt(!!O"hO %hP ehQvf&.thY_!XDBucketForOwnedAttributesordered_$XDBucketForOwnedAttributeswasEncoded_!XDBucketForOwnedAttributesstorageE4-78 h[hcOVWXYZ[\\]^_`abhdhehfhghhhihj./01234- "%gttt.tVttt,!\ "%gttt.tWttt(,!] "%gttt.tXttt,!^ "%gttt.tYttt,!_ "%gttt.tZttt,!` "%gttt.t[ttt,!a "%gttt.t\ttt,!b8 h&78 hhO-78 hhO-78 hhO-hh^XDModelPackagehhhhh^XDModelPackage_XDUMLPackageImp_XDUMLNamespaceImp_XDUMLNamedElementImp_XDUMLElementImp8 h&78 hhO-\MediaLibraryhhYXDPMModelhhWXDModel_NSKeyedArchiverh)Troot"+5:?3A[]`cehjm.NUs  )1<QSUWY[]_acez|#f?f /Tx!#9Li(5AKU`kx RTVXZ[\]^`bcdfg   $3:B':CY`m,AUl~ "0EYp"0=BMZ_i!"#%&()+-./127DIKMRTVXm      " # % 2 C E G I K M O Q S d f h j l n p r t v ! !!5!t!v!x!z!|!}!~!!!!!!!!!!!!!!!!!!!!!!!""" """$"%"&"'"("*","-"."0"1">"?"@"B"""""""""""""""""""""""""""""""#*#,#.#0#2#3#4#5#6#8#:#;#<#>#?#~#############################$ $0$W${$}$$$$$$$$$$$$$$$$$$$$$$$$$$%%8%Q%k%%%%%%%%%%%%%%%&&&&D&F&H&J&L&M&N&O&P&R&T&U&V&X&Y&&&&&&&&&&&&&&&&&&&&&&&&&&&&''''C'E'G'I'K'L'M'N'O'Q'S'T'U'W'X'''''''''''''''''''''''''''''(( (($(2(?(R(i({(() )))+)-)/)1)3)4)5)7)8):);)>)@)A)B)D)E)J)W)\)^)`)e)g)i)k)~)))*********!*.*?*A*C*E*G*I*K*M*O*`*b*d*f*h*j*l*n*p*r***************+++ + + +++++++++++Y+[+]+_+a+b+c+d+e+g+i+j+k+m+n+{+|+}++++++++++++++++,,,,,,,,,, ,",#,$,&,',f,h,j,l,n,o,p,q,r,t,v,w,x,z,{,,,,,,,,,,,,,,,------------- -"-#-H-l--------------------..... . ...$.8.J._.q................./0/2/4/6/8/9/:/;/</>/@/A/B/D/E/G//////////////////////////////020V0z0001 121R1v1111111111111111111111112!2H2l2n2p2r2t2v2x2y2{222222222222222222223 3 3333333333333 3_3a3c3e3g3h3i3j3k3m3o3p3q3s3t33333333333333344 4 4 444444444444%4&4(4g4i4k4m4o4p4q4r4s4u4w4x4y4{4|44444444444444444444444556595x5z5|5~5555555555555555555555555555686:6<6>6@6B6D6F6H6J6L6N6P6R6T6V6X6Z6\6^6`6b6d6f6h6j6l6n6p6r6t6v6x6666666666666666666666667777 7777777#70767:7H7Q7d7v7777777777888%838F8M8a8m8t8z888899#9C9E9G9I9K9M9N9O9Q9R9T9U9X9Z9[9\9^9_9d9q9v9x9z9999999:::::!:#:%:&:(:5:F:H:J:L:N:P:R:T:V:g:i:k:m:o:q:s:u:w:y:::::::::::::::; ;;;;;;;;;;;;; ;!;`;b;d;f;h;i;j;k;l;n;p;q;r;t;u;;;;;;;;;;;;;;;;;;;<<<<>> > >>>>>>X>Z>\>^>`>a>b>c>d>f>h>i>j>l>m>>>>>>>>>>>>>>>?????? ? ? ? ???????T?V?X?Z?\?]?^?_?`?b?d?e?f?h?i???@@>@^@@@@AAAAAAA A#A%A'A*A,A.A1A3A4A9AFAIAKANAPARAwAAAAAAAAAAABBBBBBBBB!B#B4B6B8B:B<B>B@BBBDBFBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC-C/C1C3C5C6C7C8C9C;C=C>C?CACBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCD5D7D9D;D=D>D?D@DADCDEDFDGDIDJDWDZD\D_DaDcDDDDDDDDDDDDDDDDEEEEE!E"E#E$E%E'E)E*E+E-E.E6ECEHEJELEQESEUEWEEEFFF F F FFFFFFFFFFFFF F%F2F7F9F;F@FBFDFFFkFFFFFFFFFFFFGG G G GGGGGG(G*G,G.G0G2G4G6G8G:GyG{G}GGGGGGGGGGGGGGGGGGGGGGGGGGGH!H#H%H'H)H*H+H,H-H/H1H2H3H5H6HCHDHEHGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHI.I0I2I4I6I7I8I9I:I<I>I?I@IBICIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJ4J[JJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKK K!K"K$K&K'K(K*K+K4KsKuKwKyK{K|K}K~KKKKKKKKKKKKKKKKKKKKKKLLLL!L#L$L%L&L'L)L+L,L-L/L0L3LrLtLvLxLzL{L|L}L~LLLLLLLLLLLLLLLLLLLLLMMMM M"M#M$M%M&M(M*M+M,M.M/MzMMMMMMMMMMMMMMMMMMMMMN NNNNNNN!NFNjNNNNNNNNNNNNNNNNNNNNOOO O OOOOOOO]O_OaOcOfOgOhOiOjOlOnOoOpOrOsOOOOOOOOOOOOOOOPP P PPPPPPPPPPPPP+P,P-P/PnPpPrPtPwPxPyPzP{P}PPPPPPPPPPPPPPPPPPPPQQQQQ!Q"Q#Q$Q%Q'Q)Q*Q+Q-Q.QmQoQqQsQvQwQxQyQzQ|Q~QQQQQQQQQQQQQQQQQQQQR!RHRlRnRpRrRtRvRxRyR|RRRRRRRRRRRRRRRRRRS S SSSSSSSSSSSS S!S`SbSdSfSiSjSkSlSmSoSqSrSsSuSvSSSSSSSSSSSSSSST T TTTTTTTTTTTTT T_TaTcTeThTiTjTkTlTnTpTqTrTtTuTTTTTTTTTTTTTTTU U U UUUUUUUUUUUUU(U;UHU[UhU{UUUUUUUUUUUV V V7VIVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVW0W2W4W6W8W9W:W;W<W>W@WAWBWDWEWWWWWWWWWWWXXXXXX X X XXXX"X'X)X+X0X3X6X8X]XXXXXXXXXXXXXXXYYYYY Y YYY"Y%Y(Y+Y.Y1Y4Y6YuYwYyY{Y~YYYYYYYYYYYYYYYYYYYYYYYYYZZ!Z$Z&Z)Z*Z+Z,Z-Z/Z1Z2Z3Z5Z6ZCZDZEZGZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[0[2[4[6[9[:[;[<[=[?[A[B[C[E[F[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\9\`\\\\\\\\\\\\\\\\\\\\\\\\\\\]$]&])]+].]/]0]1]2]4]6]7]8]:];]=]|]~]]]]]]]]]]]]]]]]]]]]]]]]]]]]^&^(^+^-^0^1^2^3^4^6^8^9^:^<^=^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_)_+_-_/_2_3_4_5_6_8_:_;_<_>_?______________`````` ` ```!`#`%`*`-`0`2`W`{`````````````````aaaaaaaa"a%a(a+a.a0aoaqasauaxayaza{a|a~aaaaaaaaaaaaaaaaaaaabbbb b#b$b%b&b'b)b+b,b-b/b0b=b>b?bAbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc*c,c.c0c3c4c5c6c7c9c;c<c=c?c@ccccccccccccccccccccccccccccccdd3dZd~ddddddddddddddddddddddddddee e"e$e'e(e)e*e+e-e/e0e1e3e4eseueweye|e}e~eeeeeeeeeeeeeeeeeeeeeeefff!f#f&f'f(f)f*f,f.f/f0f2f3frftfvfxf{f|f}f~ffffffffffffffffffffffggg g"g%g&g'g(g)g+g-g.g/g1g2g}gggggggggggggggggggghhhhhhh h#h%hJhnhhhhhhhhhhhhhhhhhhhhi i iiiiiii!i#ibidifihikiliminioiqisitiuiwixiiiiiiiiiiiiiiij jjjjjjjjjjjj j"j#j0j1j2j4jsjujwjyj|j}j~jjjjjjjjjjjjjjjjjjjjjjjkkk!k#k&k'k(k)k*k,k.k/k0k2k3krktkvkxk{k|k}k~kkkkkkkkkkkkkkkkkkkkkkll&lMlqltlvlxlzl|l~llllllllllllllllllllmmmmmmmmmm m"m#m$m&m'mfmhmjmlmompmqmrmsmumwmxmym{m|mmmmmmmmmmmmmmmnnnnnnnnnnn!n"n#n%n&nengnjnlnonpnqnrnsnunwnxnyn{n|nnnnnnnnnnnnnnnnooooooo o!o"o$o&o'o(o*o+ovooooooooooooooooooooopp pppppppCpgppppppppppppppppppppqqqq qqqqqqq[q]q_qaqdqeqfqgqhqjqlqmqnqpqqqqqqqqqqqqqqqqqrrr r rrrrrrrrrrrr)r*r+r-rlrnrprrrurvrwrxryr{r}r~rrrrrrrrrrrrrrrrrrssssss s!s"s#s%s's(s)s+s,sksmsosqstsusvswsxszs|s}s~ssssssssssssssssssttFtjtmtotqtstutwtxt{ttttttttttttttttttu u uuuuuuuuuuuu u!u`ubudufuiujukulumuouqurusuuuvuuuuuuuuuuuuuuuv v vvvvvvvvvvvv v!v#vbvdvfvhvkvlvmvnvovqvsvtvuvwvxvvvvvvvvvvvvvvvw wwwwwwwwwwwww!w"wmwwwwwwwwwwwwwwwwwwwwwwxxxx xxxx:x^xxxxxxxxxxxxxxxxxxxxxxxyyyy yyyyRyTyVyXy[y\y]y^y_yaycydyeygyhyyyyyyyyyyyyyyyyyzzzzzz z z zzzzzz z!z"z$zczezgzizlzmznzozpzrztzuzvzxzyzzzzzzzzzzzzzzz{ {{{{{{{{{{{{ {"{#{b{d{f{h{k{l{m{n{o{q{s{t{u{w{x{{{{{{{{{{{{{{{{||=|a|d|f|h|j|l|n|o|r||||||||||||||||||}}}}} } } } }}}}}}}}V}X}Z}\}_}`}a}b}c}e}g}h}i}k}l}}}}}}}}}}}}}}}~~~~~ ~ ~ ~ ~~~~~~~~~Y~[~]~_~b~c~d~e~f~h~j~k~l~n~o~~~~~~~~~~~~~~~   d 1U| IKMORSTUVXZ[\^_ Z\^`cdefgiklmop Y[]_bcdefhjklno 4X[]_acefiv MOQSVWXYZ\^_`bc LNPRUVWXY[]^_ab Wz(Ls@BDFIJKLMOQRSUVQSUWZ[\]^`bcdfg PRTVYZ[\]_abcef+ORTVXZ\]`m|~DFHJMNOPQSUVWYZGIKMPQRSTVXYZ\]RuCj79;=@ABCDFHIJLM HJLNQRSTUWYZ[]^GIKMPQRSTVXYZ\]"FIKMOQSTWdsuwy{};=?ADEFGHJLMNPQ:<>@CDEFGIKLMOPEh6]*,.0345679;<=?@;=?ADEFGHJLMNPQ:<>@CDEFGIKLMOP9<>@BDFGJWfhjlnprt/13589:;<>@ABDE/13589:;<>@ABDE:]} /Vz}#%'),-./0245689xz|~468:=>?@ACEFGIJ3579<=>?@BDEFHI2579;=?@CP_acegikm|')+-01234689:<=|~&(*,/01235789;<{}1Tt"Imprtvxz{~ !"#%'()+,kmoqtuvwxz|}~')+-01234689:<=|~&(*,/01235789;<{}%(*,.0236CRTVXZ\^`orux{~!$%&'(*,-.01prtvyz{|}!$%&'(*,-.01prtvyz{|}&Ii>begikmops  !`bdfijklmoqrsuv "%&'()+-./12qsuwz{|}~!$%&'(*,-.01prtvyz{|}!#%'(+8GIKMOQSUdgjmpsvy{!"#%&egiknopqrtvwxz{!"#%&egiknopqrtvwxz{>^~ 3WZ\^`bdehu UWY[^_`abdfghjk "#$&'fhjlopqrsuwxy{|!"#%&egiknopqrtvwxz{ -<>@BDFHJY\_behknp Y[]_bcdefhjklno []_adefghjlmnpq4Ttvxz|~)MPRTVXZ[^k|~ KMOQTUVWXZ\]^`a \^`befghikmnoqr±³µ·º»¼½¾ []_adefghjlmnpqÖú #2468:<>@ORUX[^adfĥħĪĬįİıIJijĵķĸĹĻļ PRTVYZ[\]_abcefťŧŪŬůŰűŲųŵŷŸŹŻż PRTVYZ[\]_abcefƥƧƩƫƮƯưƱƲƴƶƷƸƺƻ)Iikmoqstuxy{|~ǀǁǂDždžNjǘǝǟǡǦǩǬǮBEGIKMOPS`qsuwy{}ȁȒȕȘțȞȡȤȧȪȬ@BDFIJKLMOQRSUVɕɗɚɜɟɠɡɢɣɥɧɨɩɫɬɹɺɻɽ QSUWZ[\]^`bcdfgʦʨʪʬʯʰʱʲʳʵʷʸʹʻʼ PRTVYZ[\]_abcefˋ˯ ')+-/135DGJMPSVY[̷̡̧̨̜̟̤̥̦̪̬̭̮̰̱̚ KMOQTUVWXZ\]^`aͤͦͩͪͫͬͭͯ͢͠ͱͲͳ͵Ͷ JLNPSTUVWY[\]_`ΟΡΣΥΨΩΪΫάήΰαβδε#Ccegikmnorsuvxz{|πυϒϗϙϛϠϣϦϨ<?ACEGIJMZkmoqsuwy{ЌЏВЕИЛОСФЦ:<>@CDEFGIKLMOPяёєіљњћќѝџѡѢѣѥѦѳѴѵѷ KMOQTUVWXZ\]^`aҠҢҤҦҩҪҫҬҭүұҲҳҵҶ JLNPSTUVWY[\]_`Ӆө!#%')+-/>ADGJMPSUԔԖԘԚԝԞԟԠԡԣԥԦԧԩԪ>@BDGHIJKMOPQSTՓՕ՗ՙ՜՝՞՟ՠբդեզըթ=?ACFGHIJLNOPRS֖֛֣֤֥֧֒֔֘֜֝֞֟֡֨6VXZ\^`abefhikmnorsxׅ׊׌׎דזיכ /2468:<=@M^`bdfhjln؂؅؈؋؎ؙؑؔؗ-/136789:<>?@BCقلهىٌٍَُِْٕٖٔ٘ٙ٦٧٨٪>@BDGHIJKMOPQSTړڕڗڙڜڝڞڟڠڢڤڥڦڨک=?ACFGHIJLNOPRSxۜ "147:=@CFH܇܉܌܎ܑܒܓܔܕܗܙܚܛܝܞ2468;<=>?ACDEGH݇݉݌ݎݑݒݓݔݕݗݙݚݛݝݞݠ468:=>?@ACEFGIJމދލޏޒޓޔޕޖޘޚޛޜޞޟ -MOQSUWXY\]_`bdefijo|߁߃߅ߊߍߐߒ߷&)+-/1347DUWY[]_acevy|$&(*-./0135679:y{~579;>?@ABDFGHJK468:=>?@ACEFGIJo (+.147:=?~(*,.1234579:;=>}')+-01234689:<=|~ @BDFHJKLOPRSUWXY\]botvx} "$&'*7HJLNPRTVXilorux{~ !"#$&()*,-lnqsvwxyz|~(*,.1234579:;=>}')+-01234689:<=b !$'*-02qsvx{|}~ "$&)*+,-/12356uwy{~!#%()*+,.01245tvxz}~8:<>@BCDGHJKMOPQTUZglnpux{}"/@BDFHJLNPadgjmpsvy{ !"$%dfiknopqrtvwxz{ "$&)*+,-/12356uwy{~!#%()*+,.01245Z~"%(*iknpstuvwy{|} !#%&')*ikmorstuvxz{|~ "$%&()hjlnqrstuwyz{}~ ,.024678;<>?BDEFIJO\acejmpr $579;=?ACEVY\_behknp Y[^`cdefgiklmop}~ !"$&'(*+jlnpstuvwy{|} !#%&')*Os ^`bdghijkmopqst ]_bdghijkmopqst"Ii!$&(*-02479;>ABGTWY\_a$&(*,.024EHKNQTWZ]_     UWY[^_`abdfghjk !"acfhklmnoqstuwx  ]_bdghijkmopqst Cc:^acegiklo|   \^`befghikmnoqr!"#$%')*+-.moqsvwxyz|~ !"#$&()*,-lnpruvwxy{}~      ! # $ ' 4 C E G I K M O Q ` c f i l o r u w                             ! " a c e g j k l m n p r s t v w                             ! " a c e g j k l m n p r s t v w                 : Z z | ~                           0 T W Y [ ] _ a b e r                        RTVX[\]^_acdegh !#$cegilmnoprtuvxy  "#bdfhklmnoqstuwx *9;=?ACEGVY\_behkm    VXZ\_`abceghikl     UWY[^_`abdfghjk .Nnprtvyz{~$HKMOQSUVYfwy{}FHJLOPQRSUWXY[\   WY[]`abcdfhijlm    VXZ\_`abceghikl   -/13579;JMPSVY\_a  JLNPSTUVWY[\]_`  IKMORSTUVXZ[\^_"Bbdfhjmnorsuvy{|}=@BDFHJKN[lnprtvxz|;=?ADEFGHJLMNPQ    LNPRUVWXY[]^_ab           K M O Q T U V W X Z \ ] ^ ` a        !!!!!!"!$!&!(!*!,!.!0!?!B!E!H!K!N!Q!T!V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""?"A"C"E"H"I"J"K"L"N"P"Q"R"T"U""""""""""""""""""""""""""""""#>#@#B#D#G#H#I#J#K#M#O#P#Q#S#T################$$8$X$Z$\$^$`$c$d$e$h$i$k$l$o$q$r$s$v$w$|$$$$$$$$$$%%3%6%8%:%<%>%@%A%D%Q%b%d%f%h%j%l%n%p%r%%%%%%%%%%%%%%%%%%%%%%%%%&1&3&5&7&:&;&<&=&>&@&B&C&D&F&G&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&''''B'D'F'H'K'L'M'N'O'Q'S'T'U'W'X''''''''''''''''''''''''''''(((A(C(E(G(J(K(L(M(N(P(R(S(T(V(W(|((((((((((() ))))) )")$)&)5)8);)>)A)D)G)J)L))))))))))))))))))))))))))))))*5*7*9*;*>*?*@*A*B*D*F*G*H*J*K****************++,+O+v+++,,(,L,N,Q,S,U,W,Z,],_,a,d,f,h,k,n,o,t,,,,,,,,,-"-%-'-)-+---/-0-3-@-Q-S-U-W-Y-[-]-_-a-r-u-x-{-~-----------------------.-./.1.3.6.7.8.9.:.<.>.?.@.B.C................................./9/;/=/?/B/C/D/E/F/H/J/K/L/N/O////////////////////////00!0`0b0d0f0i0j0k0l0m0o0q0r0s0u0v000000000000000000000001111 1 11$1o111111111111111111111222 2 22222>2b2222222222222222222223333 3 33333V3X3Z3\3_3`3a3b3c3e3g3h3i3k3l33333333333333344444 4 4 4 44444444$4%4&4(4g4i4k4m4p4q4r4s4t4v4x4y4z4|4}4444444444444445555555555 5"5#5$5&5'5f5h5j5l5o5p5q5r5s5u5w5x5y5{5|555555555555555566A6e6h6j6l6n6p6r6s6v666666666666666666777 7 777777777777Z7\7^7`7c7d7e7f7g7i7k7l7m7o7p777777777777777888 8 888888888888Z8\8^8`8c8d8e8f8g8i8k8l8m8o8p888888888888888999 9 999999999999f99999999999999999999999:::: :::5:Y::::::::::::::::::::::::;;;; ; ;;M;O;Q;S;V;W;X;Y;Z;\;^;_;`;b;c;;;;;;;;;;;;;;;;;;;<<<<<<< < < < <<<<<<^<`>8>\>_>a>c>e>g>i>j>m>z>>>>>>>>>>>>>>>>>>>??????? ? ? ?????Q?S?U?W?Z?[?\?]?^?`?b?c?d?f?g??????????????????@@@@@@@ @ @ @@@@P@R@T@V@Y@Z@[@\@]@_@a@b@c@e@f@@@@@@@@@@@@@@@@@@AAAAAAA A A A AAA[A~AAAAAAAAAAAAAAAAAAAAAAAAAABBB)BMBtBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCACCCECGCJCKCLCMCNCPCRCSCTCVCWCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDRDTDVDXD[D\D]D^D_DaDcDdDeDgDhDDDDDDDDDDDDDDDDDEEEEEEE E E EEEEEQESEUEWEZE[E\E]E^E`EbEcEdEfEgEEEEEEEEEEEEEEEEFF,FPFSFUFWFYF[F]F^FaFnF}FFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGEGGGIGKGNGOGPGQGRGTGVGWGXGZG[GGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHDHFHHHJHMHNHOHPHQHSHUHVHWHYHZHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIOIrIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJ4JXJJJJJJJJJJJJJJJJJJJJJJJJJJKKKCKEKGKIKLKMKNKOKPKRKTKUKVKXKYKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLTLVLXLZL]L^L_L`LaLcLeLfLgLiLjLLLLLLLLLLLLLLLLMMMMMM M M M MMMMMMSMUMWMYM\M]M^M_M`MbMdMeMfMhMiMMMMNNNNN N N NNNN"N%N(N*NCNNNNNNNNNNNNNNNNNNNNNNNNO O3O<OOOTOgOpOOOOOOOOOOP=P?PAPCPFPGPHPIPJPLPNPOPPPRPSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQIQlQQQQQQQQQQQQQQQQQQQQQQQQQQQQRR;RbRRRRRRRRRRRRRRRRRRRRRRRRRRRRRS/S1S3S5S8S9S:S;S<S>S@SASBSDSESSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTT@TBTDTFTITJTKTLTMTOTQTRTSTUTVTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUU?UAUCUEUHUIUJUKULUNUPUQURUTUUUUUUUUUUUUUUUUUUUVV>VAVCVEVGVIVKVLVOV\VkVmVoVqVsVuVwVyVVVVVVVVVVVVVVVVVVVVVVVVW3W5W7W9W<W=W>W?W@WBWDWEWFWHWIWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX2X4X6X8X;X<X=X>X?XAXCXDXEXGXHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY=Y?YAYCYFYGYHYIYJYLYNYOYPYRYSYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZIZlZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[:[a[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\.\0\2\4\7\8\9\:\;\=\?\@\A\C\D\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]?]A]C]E]H]I]J]K]L]N]P]Q]R]T]U]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^>^@^B^D^G^H^I^J^K^M^O^P^Q^S^T^^^^^^^^^^^^^^^^^__=_@_B_D_F_H_J_K_N_[_j_l_n_p_r_t_v_x________________________`3`5`7`9`<`=`>`?`@`B`D`E`F`H`I``````````````````````````````a3a5a7a9a<a=a>a?a@aBaDaEaFaHaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab>babbbbbbbbbbbbbbbbbbbbbbbbbbbbc c/cVczc}cccccccccccccccccccccccccccd#d%d'd)d,d-d.d/d0d2d4d5d6d8d9dxdzd|d~dddddddddddddddddddddddddddddde4e6e8e:e=e>e?e@eAeCeEeFeGeIeJeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef3f5f7f9f<f=f>f?f@fBfDfEfFfHfIfffffffffffffffffgg2g5g7g9g;g=g?g@gCgPg_gagcgegggigkgmg|gggggggggggggggggggggggh(h*h,h.h1h2h3h4h5h7h9h:h;h=h>h}hhhhhhhhhhhhhhhhhhhhhhhhhhhhhi(i*i,i.i1i2i3i4i5i7i9i:i;i=i>i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiij3jVjvjjjjjjjjjjjjjjjjjjjjjjjjjjjkk$kKkokrktkvkxkzk|k}kkkkkkkkkkkkkkkkkkkkklllll!l"l#l$l%l'l)l*l+l-l.lmlolqlslvlwlxlylzl|l~lllllllllllllllllllllllm)m+m-m/m2m3m4m5m6m8m:m;m<m>m?m~mmmmmmmmmmmmmmmmmmmmmmmmmmmmmn(n*n,n.n1n2n3n4n5n7n9n:n;n=n>n}nnnnnnnnnnnnnnnnoo'o*o,o.o0o2o4o5o8oEoToVoXoZo\o^o`oboqotowozo}oooooooooooooooooooppp p"p%p&p'p(p)p+p-p.p/p1p2pqpspupwpzp{p|p}p~pppppppppppppppppppppqqqq!q$q%q&q'q(q*q,q-q.q0q1qpqrqtqvqyqzq{q|q}qqqqqqqqqqqqqqqqqqqqqr&rIrirrrrrrrrrrrrrrrrrrrrrrrrrrrrss>sbsesgsisksmsospsssssssssssssssssssssst t tttttttttttt t!t`tbtdtftitjtktltmtotqtrtstutvtttttttttttttttttttuuu u"u%u&u'u(u)u+u-u.u/u1u2uqusuuuwuzu{u|u}u~uuuuuuuuuuuuuuuuuuuuuvvvv!v$v%v&v'v(v*v,v-v.v0v1vpvrvtvvvyvzv{v|v}vvvvvvvvvwwww!w#w%w'w(w+w8wGwIwKwMwOwQwSwUwdwgwjwmwpwswvwyw{wwwwwwwwwwwwwwwxxxxxxxxxxx!x"x#x%x&xexgxixkxnxoxpxqxrxtxvxwxxxzx{xxxxxxxxxxxxxxxyyyyyyyyyyy!y"y#y%y&yeygyiykynyoypyqyrytyvywyxyzy{yyyyyyyyyyyyyyyzz>z^z~zzzzzzzzzzzzzzzzzzzzzzzzzzz{ {4{X{[{]{_{a{c{e{f{i{v{{{{{{{{{{{{{{{{{{{||||| | | | ||||||||V|X|Z|\|_|`|a|b|c|e|g|h|i|k|l|||||||||||||||||||}}}}}}}}}}!}#}$}%}'}(}g}i}k}m}p}q}r}s}t}v}x}y}z}|}}}}}}}}}}}}}}}}}~~~~~~~~~~ ~"~#~$~&~'~f~h~j~l~o~p~q~r~s~u~w~x~y~{~|~~~!.=?ACEGIKZ]`cfiloq  Z\^`cdefgiklmop  Y[]_bcdefhjklno2Rrtvxz|}~(LOQSUWYZ]j{}  JLNPSTUVWY[\]_`  []_adefghjlmnpq  Z\^`cdefgiklmop   "13579;=?NQTWZ]`ce   NPRTWXYZ[]_`acd 1Uu .Qx  !#&)+-/258=JMORUW|  "$&(*;>ADGJMPSU>@BDGHIJKMOPQST  JLOQTUVWXZ\]^`anqtwy{2479<=>?@BDEFHI[hwz}=` 0W{~$&(*-./0135679:y{}579;>?@ABDFGHJK468:=>?@ACEFGIJ368:<>@ADQ`bdfhjln})+-/234568:;<>?~)+-/234568:;<>?~4Ww(Osvxz|~ "%&'()+-./12qsuwz{|}~-/136789:<>?@BC,.0256789;=>?AB+.024689<IXZ\^`bdfux{~ "$&)*+,-/12356uwy{~!#%()*+,.01245tvxz}~+NnEilnprtvwz!#$%'(gikmpqrstvxyz|}#%'),-./0245689xz|~"$&(+,-./134578wy{}!$&(*,./2?NPRTVXZ\knqtwz} !"#%'()+,kmoqtuvwxz|}~ !"$&'(*+jlnpstuvwy{|} Cc:^acegiklo|   \^`befghikmnoqr!"#$%')*+-.moqsvwxyz|~ !"#$&()*,-lnpruvwxy{}~!#$'4CEGIKMOQ`cfiloruw   !`bdfijklmoqrsuv   _acehijklnpqrtu8Xxz|~/SVXZ\^`adq   QSUWZ[\]^`bcdfg  "#bdfhklmnoqstuwx !"acegjklmnprstvw )8:<>@BDFUX[^adgjl    VXZ\_`abceghikl    VXZ\_`abceghikl /Ooqsuwz{|&JMOQSUWX[hy{} HJLNQRSTUWYZ[]^  Y[]_bcdefhjklno   XZ\^abcdegijkmn    /13579;=LORUX[^ac    MOQSVWXYZ\^_`bc    MOQSVWXYZ\^_`bc&Ffhjlnqrsvwyz|ADFHJLNOR_prtvxz|~?ACEHIJKLNPQRTU”–™›žŸ ¡¢¤¦§¨ª«¸¹º¼   PRTVYZ[\]_abcefåçéëîïðñòôö÷øúû    OQSUXYZ[\^`abdeĊĮ &(*,.024CFILORUXZřśŞŠţŤťŦŧũūŬŭůŰDFHJMNOPQSUVWYZƙƛƞƠƣƤƥƦƧƩƫƬƭƯưDFHJMNOPQSUVWYZǙǛǝǟǢǣǤǥǦǨǪǫǬǮǯǸǹǻ  Z~Ȣ 3Zzɞ)MtʘʛʝʟʡʣʥʦʩʶACFHKLMNOQSTUWXabdˣ˥˧˩ˬ˭ˮ˯˰˲˴˵˶˸˹    MORTWXYZ[]_`acdmnp̵̸̯̱̳̹̺̻̼̾  (+.146Ylͫͭͯͱʹ͵Ͷͷ͸ͺͼͽ;    )69<?BDQΜο   #0579>ADFkϏ϶   *-0369<?BDЃЅЇЉЌЍЎЏАВДЕЖИЙ-/24789:;=?@ACDQRSUєіјњѝўџѠѡѣѥѦѧѩѪ>@BDGHIJKMOPQSTғҕҗҙҜҝҞҟҠҢҤҥҦҨҩ#GnӒӕӗәӛӝӟӠӣӰӿ2468;<=>?ACDEGHԇԉԋԍԐԑԒԓԔԖԘԙԚԜԝ1357:;<=>@BCDFGՆՈՊՌՏՐՑՒՓՕ՗՘ՙ՛՜02469:;<=?ABCEFORUW\e~ևַ֠:^ׂץ:Z~آؤاةثحذسصطغؼؾ -Tx{}فكمنىٖ٧٩٫٭ٯٱٳٵٷ!#%'*+,-.023467vxz|ڀځڂڃڅڇڈډڋڌ "%'*+,-.023467@ACۂۄۆۈۋیۍێۏۑۓ۔ەۗۘ ,?~܀܂܄܇܈܉܊܋܍܏ܐܑܓܔ !0;݆ݩ !#(+.0Uyޠ #&),.moqsvwxyz|~߀߂߃!"#$%')*+-.;<=?~(*,.1234579:;=>} 1X|!#&'()*,./023rtvx{|}~!#&'()*,./023rtvx{|}~ "%&'()+-./12}"%'Lp  #%dfhjmnopqsuvwyz !"$%2346uwy{~!#%()*+,.01245tvxz}~(Osvxz|~ !#%&')*ikmorstuvxz{|~ !#%&')*ikmorstuvxz{|~ "$%&()258:?\_adgjmBb!#&)+-0247:;@MPRUXZ !#%')+->ADGJMPSVXACEGJKLMNPRSTVW    MORTWXYZ[]_`acdqtwz}  IKNPSTUVWY[\]_`r$Gg>begikmops   !`bdfijklmoqrsuv "%&'()+-./12qsuwz{|}~!$%&'(*,-.01prtvyz{|}!#%'(+8GIKMOQSUdgjmpsvy{!"#%&egiknopqrtvwxz{!"#%&egiknopqrtvwxz{>^~5Y\^`bdfgjw   WY[]`abcdfhijlm "$%&()hjlnqrstuwyz{}~!#$%'(gikmpqrstvxyz|}"/>@BDFHJL[^adgjmpr   \^`befghikmnoqr   \^`befghikmnoqr5Uuwy{},PSUWY[]^an   NPRTWXYZ[]_`acd   _acehijklnpqrtu   ^`bdghijkmopqst          & 5 7 9 ; = ? A C R U X [ ^ a d g i                               S U W Y \ ] ^ _ ` b d e f h i                               S U W Y \ ] ^ _ ` b d e f h i                 , L l n p r t w x y | }                    # G J L N P R T U X e v x z | ~                        EGIKNOPQRTVWXZ[    VXZ\_`abceghikl     UWY[^_`abdfghjk   ,.02468:ILORUX[^`  JLNPSTUVWY[\]_`  JLNPSTUVWY[\]_`   _acehijklnpqrtu9Yy{}.RUWY[]_`cp   PRTVYZ[\]_abcef !"acegjklmnprstvw   !`bdfijklmoqrsuv  (79;=?ACETWZ]`cfik    TVXZ]^_`acefgij    SUWY\]^_`bdefhi ,Llnprtvwx{|~!EHJLNPRSVctvxz|~CEGILMNOPRTUVXY               T V X Z ] ^ _ ` a c e f g i j                !!!!!! ! ! ! !!!!!!S!U!W!Y!\!]!^!_!`!b!d!e!f!h!i!!!!"""""" " """*","."0"2"4"6"8"G"J"M"P"S"V"Y"\"^""""""""""""""""""""""""#######G#I#K#M#P#Q#R#S#T#V#X#Y#Z#\#]########################$$$$$$$F$H$J$L$O$P$Q$R$S$U$W$X$Y$[$\$$$$$$$$$$$$$$$$%%?%_%a%c%e%g%i%j%k%n%o%q%r%t%v%w%x%{%|%%%%%%%%%%%&&8&;&=&?&A&C&E&F&I&V&g&i&k&m&o&q&s&u&w&&&&&&&&&&&&&&&&&&&&&&&&&'6'8':'<'?'@'A'B'C'E'G'H'I'K'L''''''''''''''''''''''''''''(((((((G(I(K(M(P(Q(R(S(T(V(X(Y(Z(\(](((((((((((((((((((((((()))))))F)H)J)L)O)P)Q)R)S)U)W)X)Y)[)\)))))))))))*****!*#*%*'*)*+*:*=*@*C*F*I*L*O*Q******************************+:+<+>+@+C+D+E+F+G+I+K+L+M+O+P++++++++++++++++++++++++++++++,9,;,=,?,B,C,D,E,F,H,J,K,L,N,O,,,,,,,,,,,,,,,,--2-R-T-V-X-Z-\-]-^-a-b-d-e-g-i-j-k-n-o-t----------..+...0.2.4.6.8.9.<.I.Z.\.^.`.b.d.f.h.j.{.~......................./)/+/-///2/3/4/5/6/8/:/;/</>/?/~/////////////////////////////////0:0<0>0@0C0D0E0F0G0I0K0L0M0O0P000000000000000000000000000000191;1=1?1B1C1D1E1F1H1J1K1L1N1O1t111111111112222222222-202326292<2?2B2D2222222222222222222222222222223.3032343738393:3;3=3?3@3A3C3D3333333333333333333333333333334-4/4143464748494:4<4>4?4@4B4C44444444444444444444444444444444457595;5=5?5@5A5B5C5E5G5H5I5K5L555555555555555566/6O6Q6S6U6W6Y6Z6[6^6_6a6b6d6f6g6h6k6l6q6~66666666677(7+7-7/71737576797F7W7Y7[7]7_7a7c7e7g7x7{7~77777777777777777777778&8(8*8,8/80818283858788898;8<8{8}8888888888888888888888888888888897999;9=9@9A9B9C9D9F9H9I9J9L9M999999999999999999999999999999:6:8:::<:?:@:A:B:C:E:G:H:I:K:L:q::::::::::::; ;;;;;;;;*;-;0;3;6;9;<;?;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<*<,<.<0<3<4<5<6<7<9<;<<<==?=~===============>>">B>D>F>H>J>L>M>N>Q>R>T>U>W>Y>Z>[>^>_>d>q>v>x>z>>>>>>>??? ?"?$?&?(?)?,?9?J?L?N?P?R?T?V?X?Z?k?n?q?t?w?z?}??????????????????@@@@@"@#@$@%@&@(@*@+@,@.@/@n@p@s@u@x@y@z@{@|@~@@@@@@@@@@@@@@@@@@@@@@@@A*A,A.A0A3A4A5A6A7A9A;A<A=A?A@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB)B+B-B/B2B3B4B5B6B8B:B;B<B>B?BdBBBBBBBBBBBBCCCCCC C CCC C#C&C)C,C/C2C4CsCuCwCyC|C}C~CCCCCCCCCCCCCCCCCCCCCCCDDD!D#D&D'D(D)D*D,D.D/D0D2D3DrDtDvDxD{D|D}D~DDDDDDDDDDDDDDDDDDDDDDEEE E"E%E&E'E(E)E+E-E.E/E1E2EqEsEuEwEzE{E|E}E~EEEEEEEEFF5F7F9F;F=F?F@FAFDFEFGFHFJFLFMFNFQFRFWFdFiFkFmFrFuFxFzFFFGGGGGGGGGG,G=G?GAGCGEGGGIGKGMG^GaGdGgGjGmGpGsGvGxGGGGGGGGGGGGGGGH HHHHHHHHHHHHH!H"HaHcHfHhHkHlHmHnHoHqHsHtHuHwHxHHHHHHHHHHHHHHHHHHHIII!I#I&I'I(I)I*I,I.I/I0I2I3IrItIvIxI{I|I}I~IIIIIIIIIIIIIIIIIIIIIIJJJ J"J%J&J'J(J)J+J-J.J/J1J2JWJ{JJJJJJJJJJJJJJJJJJKKKKKKKK"K%K'KfKhKkKmKpKqKrKsKtKvKxKyKzK|K}KKKKKKKKKKKKKKKLLLLLLLLLL L"L#L$L&L'LfLhLkLmLpLqLrLsLtLvLxLyLzL|L}LLLLLLLLLLLLLLLMMMMMMMMMM M"M#M$M&M'MfMhMjMlMoMpMqMrMsMuMwMxMyM{M|MMN N*N,N.N0N2N4N5N6N9N:N<N=N?NANBNCNFNGNLNYN^N`NbNgNjNmNoNNNOOOO O OOOOO!O2O4O6O8O:O<O>O@OBOSOVOYO\O_ObOeOhOkOmOOOOOOOOOOOOOOOPPPPP P P P PPPPPPPPVPXP[P]P`PaPbPcPdPfPhPiPjPlPmPzP{P|P~PPPPPPPPPPPPPPPQQQQQQQQQQ!Q#Q$Q%Q'Q(QgQiQkQmQpQqQrQsQtQvQxQyQzQ|Q}QQQQQQQQQQQQQQQRRRRRRRRRR R"R#R$R&R'RLRpRRRRRRRRRRRRRRRRRRRSSS SSSSSSS[S]S`SbSeSfSgShSiSkSmSnSoSqSrSSSSSSSSSSSSSSSTTT T TTTTTTTTTTTT[T]T`TbTeTfTgThTiTkTmTnToTqTrTTTTTTTTTTTTTTTUUU U UUUUUUUUUUUU[U]U_UaUdUeUfUgUhUjUlUmUnUpUqUUUVV!V#V%V'V)V*V+V.V/V1V2V5V7V8V9V<V=VBVOVTVVVXV]V`VcVeVVVVVVWWWWWW WW(W*W,W.W0W2W4W6W8WIWLWOWRWUWXW[W^WaWcWWWWWWWWWWWWWWWWWWWXXXXXXXX X X X XLXNXQXSXVXWXXXYXZX\X^X_X`XbXcXpXqXrXtXXXXXXXXXXXXXXXYY Y YYYYYYYYYYYYY]Y_YaYcYfYgYhYiYjYlYnYoYpYrYsYYYYYYYYYYYYYYYZZ Z Z ZZZZZZZZZZZZBZfZZZZZZZZZZZZZZZZZZZZZ[[[[ [ [[[Q[S[U[W[Z[[[\[][^[`[b[c[d[f[g[[[[[[[[[[[[[[[[[[\\\\\\\ \ \ \\\\P\R\U\W\Z\[\\\]\^\`\b\c\d\f\g\\\]]<]\]]]]^^^^^^^ ^#^%^'^*^,^.^1^4^5^:^G^J^L^O^R^T^y^^^^^^^^^^^_______!_#_%_'_8_;_>_A_D_G_J_M_P_R______________________________`;`=`?`A`D`E`F`G`H`J`L`M`N`P`Q```````````````````````````aaaaaaaGaIaLaNaQaRaSaTaUaWaYaZa[a]a^akaparataya{a}aaaaaaaaaaaaaaaabbbbbbbb b!b#b%b&b'b)b*b1b>bMbObRbUbXb[b]b`bobrbubxb{b~bbbbbbbbc c.cNcncpcrctcvcyczc{c~ccccccccccccccccccccd$dHdKdMdOdQdSdUdVdYdfdwdyd{d}ddddddddddddddddddddddddeeeeeeeFeHeJeLeOePeQeReSeUeWeXeYe[e\eeeeeeeeeeeeeeeeeeefffff f f fffffffffWfYf[f]f`fafbfcfdfffhfifjflfmfffffffffffffffggggg g g g ggggggggVgXgZg\g_g`gagbgcgeggghgigkglggghhhhh h h hhhh-h/h1h3h5h7h9h;hJhMhPhShVhYh\h_hahhhhhhhhhhhhhhhhhhhhhiiiiiiii i iJiLiNiPiSiTiUiViWiYi[i\i]i_i`iiiiiiiiiiiiiiiiiiiiiijjjjjjj j jIjKjMjOjRjSjTjUjVjXjZj[j\j^j_jjjjjjjjjjjjjjjjk"kBkbkdkfkhkjkmknkokrkskukvkxk{k|k}kkkkkkkkkkkkkll=l@lBlDlFlHlJlKlNl[lllnlplrltlvlxlzl|lllllllllllllllllllllllllm;m=m?mAmDmEmFmGmHmJmLmMmNmPmQmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnn n n n nLnNnPnRnUnVnWnXnYn[n]n^n_nanbnnnnnnnnnnnnnnnnnnnnoooooooo o o oKoMoOoQoToUoVoWoXoZo\o]o^o`oaoooooooopppppp"p$p&p(p*p,p.p0p?pBpEpHpKpNpQpTpVpppppppppppppppppppppppppppppqq?qAqCqEqHqIqJqKqLqNqPqQqRqTqUqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr>r@rBrDrGrHrIrJrKrMrOrPrQrSrTrrrrrrrrrrrrrrrrss7sWsYs[s]s_sbscsdsgshsjsksnsqsrsssvsws|sssssssssstt3t6t8t:t<t>t@tAtDtQtbtdtfthtjtltntptrtttttttttttttttttttttttttu1u3u5u7u:u;u<u=u>u@uBuCuDuFuGuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvBvDvFvHvKvLvMvNvOvQvSvTvUvWvXvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwAwCwEwGwJwKwLwMwNwPwRwSwTwVwWw|wwwwwwwwwwwx xxxxx x"x$x&x5x8x;x>xAxDxGxJxLxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy5y7y9y;y>y?y@yAyByDyFyGyHyJyKyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyz4z6z8z:z=z>z?z@zAzCzEzFzGzIzJzzzzzzzzzzzzzzzz{{.{N{P{R{T{V{Y{Z{[{^{_{a{b{d{g{h{i{l{m{r{{{{{{{{{{||)|,|.|0|2|4|6|7|:|G|X|Z|\|^|`|b|d|f|h|y|||||||||||||||||||||||||}'})}+}-}0}1}2}3}4}6}8}9}:}<}=}|}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~8~:~<~>~A~B~C~D~E~G~I~J~K~M~N~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~79;=@ABCDFHIJLMr+.147:=@B+-/145678:<=>@A*,.0345679;<=?@#CEGIKNOPSTVWY\]^abgty{}!#%')+,/<MOQSUWY[]nqtwz} "%&'()+-./12qsvx{|}~-/136789:<>?@BC,.0256789;=>?ABg    #&),/257vx{}!#%'*+,-.023467vx{}!#%'*+,-.023467vxz|:<>@BEFGJKMNPRSTWX]joqsx{~!"%2CEGIKMOQSdgjmpsvy|~!#$%'(gilnqrstuwyz{}~#%'),-./0245689xz|~"$&(+,-./134578]"%(+-lnpruvwxy{}~ !"#%'()+,kmoqtuvwxz|}~ !"$&'(*+jlnpstuvwy{|}.02469:;>?ABDGHILMR_dfhmpsu  '8:<>@BDFHY\_behknqs   \^acfghijlnoprs!"#$%')*+-.moqsvwxyz|~ !"#$&()*,-Rv  "acegjklmnprstvw   !`bdfijklmoqrsuv   !`bdfijklmoqrsuv !"#%'()+,kmpruvwxy{}~02468:;<?@BCEGHILMR_dfhmpsu  '8:<>@BDFHY\_behknqs   \^acfghijlnoprs!"#$%')*+-.moqsvwxyz|~ !"#$&()*,-Rv  "acegjklmnprstvw   !`bdfijklmoqrsuv   _acehijklnpqrtu#%')+-./23568:;<?@IV[]_dgjl   /13579;=?PSVY\_behj    SUXZ]^_`acefgijwxy{ !"$%dfhjmnopqsuvwyz !#$Im XZ]_bcdefhjklno   XZ]_bcdefhjklno   XZ\^abcdegijkmn "$&'(+,./134589>KPRTY\_a$&(*,.024EHKNQTWZ]_ HJMORSTUVXZ[\^_lmnp  Y[]_bcdefhjklno   >b  MOQSVWXYZ\^_`bc    LNPRUVWXY[]^_ab   KMOQTUVWXZ\]^`a!"$&'(+,1>CEGLORTy!#%'8;>ADGJMPR;=@BEFGHIKMNOQR_`ac    LNPRUVWXY[]^_ab   1U|@BDFIJKLMOQRSUV?ACEHIJKLNPQRTU>@BDGHIJKMOPQST]^`mnoq~ "/013@ISZbty~hMediaLibrary.xcdatamodeld/MediaLibrary-2.5.xcdatamodel/layout000066400000000000000000000675731250533726500244760ustar00rootroot00000000000000bplist00  X$versionX$objectsY$archiverT$top(">UVZbhnsvz~"&04@AEIMPS^_bmnopsw{ !"&*.14?@DOPQUY]himqux{   "&04>IJNRVY\ghimxyz~   +,048;>IJKLP[\]aeijoy "+,-1:=AFJKPVY^adgmvz "$%*036;>ADJSTXajkox  !"&/89:>GIJOUX]`cfluy  &),147:@IJNXabfpyz{      % ( + 0 3 6 9 ? H I M V _ ` d m v w x |              U$null WNS.keysZNS.objectsV$class  'Wstorage_hasCombinedRelationshipsXmappings !\XDDataSource_XDDiagramControllerZXDGraphicsZXDDelegate #=$%&'()*+,-./0123456789:;<(8IXk{΀&ހdj#6?@ABCDE FGHJKLMNOPQRT_XDDiagramStorage_XDTailConnectionXXDBoundsZXDUniqueID]XDHeadLineEnd]XDTailLineEnd_XDDrawingStyles_XDHeadConnectionZXDLineType^XDGraphicFlags%  '"_{{146, 483.5}, {68, 75}} WYX  [\]^_$aXXDShadowYXDGraphic_XDShadowStyleFlags  cdefg_NSShadowBlurRadius\NSShadowVert #@ # ijklZ$classnameX$classesXNSShadowkmXNSObjectijop]XDShadowStyleqrm]XDShadowStyle^XDDrawingStyleijtuWNSArraytmw xyVXDUUID {|}YNS.string_$DD1536DB-EA87-4954-9B44-AB3B12EB1025ij_NSMutableStringmXNSStringij[XDGraphicIDm[XDGraphicID \a$VXDName^XDLineEndFlagsXXDOrigin\XDIdentifierWXDSlopeWXDWidthUXDGapYXDLineGap\XDBezierPath"A"?"^XDArrowLineEndUArrow\{214, 558.5}V{1, 0} ZNSSegmentsO$A@@A@ij\NSBezierPathm\NSBezierPathijYXDLineEndm \a$ "A"?"!_XDDoubleArrowsLineEnd]Double Arrows\{146, 483.5}W{-1, 0} OHA@@A@AA@@AA@ \9$_XDTargetGraphic#$H ?EABR_XDCollapsedCompartments^XDCompartments_XDCompartmentGraphicFlagsij\XDConnectionm\XDConnection \1$&$H ?EABR߁ij]XDLineGraphicm]XDLineGraphicYXDGraphic?@ABCDE FGHPR7)-/2*'5_{{342, 495.5}, {63, 48}} Y+ [\]^%a,( cde #@ # w y. {|_$F01FF926-739B-4B33-80AA-2B16187932EB \a   %0"A"?"(1\{405, 495.5} O$A@@A@ \a%3 "A"?"(4\{342, 543.5}  OHA@@A@AA@@AA@ \:%6$(H ?EAB'+,-R/Ӂ́ˀ \9%#$(?@ABCDE FGH6789:;P=R?H9=?B:'Gp_{{146, 483.5}, {68, 75}} BYC; [\]^G&a<8 cdeKL #@ # w Ny> {|R_$E65F2118-6C48-4199-A516-FCFF161B0504 \aUYZ[&]@ "A"?"8A\{146, 483.5} `O$A@@A@ \cadfhij&lDEC"A"?"8F_XDStraightLineEndXStraight\{214, 558.5} qOA \1&&$8 \9&#$8?@ABCDE FGH}~PRWJNPSK'V`_{{342, 495.5}, {63, 48}} YL [\]^'aMI cde #@ # w yO {|_$63B6001B-0760-479A-9DFA-12D2FB64A387 \a'Q "A"?"IR\{342, 543.5} O$A@@A@ \caf'DTC"A"?"IU\{405, 495.5} OA \9'#$I \:'6$I?@ABCDE FGHPRˀiY]_cZ'h _{{146, 142.5}, {266, 384}} Yπ[ [\]^(a\X cde؀ #@ # w y^ {|ހ_$33CCD5F0-42A5-497C-9898-5E3D5E02D717 \a(a` "A"?"Xb^XDArrowLineEnd\{146, 526.5} [NSLineWidthO$A@@A@#@ \a(efd"A"?"Xg_XDDoubleArrowsLineEnd]Double Arrows\{412, 142.5} OHA@@A@AA@@AA@#@ \1(&$X \6(j$XH ?EAB R~vu|?@ABCDE FGHPR zlprum'yP_{{146, 142.5}, {266, 384}} #Y$n [\]^()aok cde,- #@ # w /yq {|3_$6B0EE429-E70B-49BC-BBE0-83DEB5DCB31D \a6:;<)>esd"A"?"kt\{412, 142.5} BCOHA@@A@AA@@AA@#@ \caFHJKL)NDwv "A"?"kx_XDStraightLineEnd\{146, 526.5} STOA#@ \6)j$k \1)&$kFHCG @?EAB^_`aPbdeg4'}|_5{{540, 102.17073170731707}, {36, 14.158536585365852}} jYk~ [\]^o*a{ cdest #@ # w vy {|z_$37A993E3-3A21-4611-A291-50785EACA484 \|a}*"A"?"{_XDEmptyArrowLineEnd[Empty Arrow_{540, 102.17073170731707}_{-36, -14.158536585365852} O-A@@A@#@ \6*j${ \7*${H ?EABRFHCG @?EABaP$'_5{{540, 53.441176470588232}, {25, 6.6176470588235361}} Y [\]^+a cde #@ # w y {|_$351DBB49-52E9-4954-BAD5-EB77AA5B98CB \|a+Ȁ"A"?"_{540, 60.058823529411768}_{-25, 6.6176470588235361} ΀O-A@@A@#@ \6+j$ \8+$H ?EABR?@ABCDE FGHPR'@_{{335, 369.5}, {70, 6}} Y [\]^,a cde #@ # w y {|_$2AE9F60C-B948-4134-A6BB-A4D8A976F40D \a, "A"?"^XDArrowLineEnd\{405, 375.5} O$A@@A@#@ \ca,D "A"?"_XDStraightLineEnd\{335, 369.5}  !OA#@ \2,$H ?EAB'+,-R/3' % \4,$H ?EAB59:;R=cUMLS?@ABCDE FGH@ABCDEPGR '_{{146, 354.5}, {61, 159}} KYL [\]^P-a cdeTU #@ # w Wy {|[_$A027925D-A479-4AAE-B3E6-B48EB98E7516 \a^`bcd-f"A"?"^XDArrowLineEnd\{207, 354.5} klO$A@@A@#@ \caoqstu-wD "A"?"_XDStraightLineEnd\{146, 513.5} |}OA#@ \4-$ \1-&$?@ABCDE FGHPRˀ̀€Āɀ'̀_{{146, 354.5}, {61, 159}} Y [\]^.a cde #@ # w yÀ {|_$086D1CD5-2AE0-4907-9781-66C0FAA162FF \a.ƀǀŀ "A"?"_XDDoubleArrowsLineEnd]Double Arrows\{146, 513.5} OHA@@A@AA@@AA@#@ \a`.ʀ"A"?"\{207, 354.5} ŀO$A@@A@#@ \1.&$ \4.$?@ABCDE FGHPR߀πӀՀڀЀ'݀_{{146, 129.5}, {43, 369}} Y܀р [\]^/aҀ cde #@ # w yԀ {|_$D6C2A281-9EAC-4C65-9451-96EDAC2FFA20 \a/׀؀ր"A"?"΀_XDDoubleArrowsLineEnd]Double Arrows\{189, 129.5} OHA@@A@AA@@AA@#@ \a/׀ۀր "A"?"΀\{146, 498.5}   OHA@@A@AA@@AA@#@ \3/ހ$H ?EABRK=54; \1/&$?@ABCDE FGH"#$%&'P)R'_{{146, 129.5}, {43, 369}} -Y. [\]^20a cde67 #@ # w 9y {|=_$05C14C76-1BE9-424C-834A-39925F07D400 \?a@BDEF0H "A"?"_XDDoubleArrowsLineEnd]Double Arrows\{146, 498.5} NOOHA@@A@AA@@AA@#@ \caRTVWX0ZD"A"?"_XDStraightLineEnd\{189, 129.5} _`OA#@ \10&$ \30ހ$_{{18, 12}, {128, 523}} kYlmp \qrstu1wxR[XDFillColor_XDGradientColor_XDGradientAngle_XDFillStyleFlags&"Cz{ |}~UNSRGB\NSColorSpaceO0.79 0.63108281 0.679980358ijWNSColormz{ }~O&0.9299240239 0.8770276033 0.893220054ij_XDCompartmentGraphicFillStylem_XDCompartmentGraphicFillStyle[XDFillStyle^XDDrawingStyle \1[XDLineWidth]XDStrokeColor_XDStrokeStyleFlags"?&z{ }~O'0.5266666667 0.4207218733 0.4533202387ij]XDStrokeStylem]XDStrokeStyle^XDDrawingStylew y {|_$A1A53950-6EAB-4341-9B84-8A9083E728DE = 1_XDCompartmentFlagsWXDLabel_XDCompartmentItemMinSize[XDIconImage_XDCompartmentGraphic_XDBackgroundColor_XDCompartmentItem@&_/XDPPCompartmentGraphicNameCompartmentIdentifier ]XDCompartmentZXDDataCell a[NSCellFlags\NSCellFlags2_XDAlternateImageYNSSupport_XDCompartmentItemCellFlagsWXDImage_NSBackgroundColor[NSTextColor^XDButtonTarget@   VNSSizeXNSfFlagsVNSName#@& _#.HelveticaNeueDeskInterface-RegularijVNSFontm {~[NSColorName]NSCatalogNameWNSColor VSystem_textBackgroundColor{ ~WNSWhiteB1 {~  YtextColor{ ~B0ij_XDCompartmentItemCellm_XDCompartmentItemCell_NSTextFieldCell\NSActionCellVNSCellij_XDCompartmentItemm_XDCompartmentItemW{0, 15}ij]XDCompartmentm]XDCompartment  1&_5XDPPCompartmentGraphicAttributesCompartmentIdentifierZAttributes  a   $'1*&_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships 0 a*  ij;<^NSMutableArray;tm> ?@\NSRangeCountijBC_NSMutableIndexSetDEm_NSMutableIndexSetZNSIndexSetijGH_XDCompartmentGraphicIm_XDCompartmentGraphic_{{405, 234}, {128, 148}} LYMN!#p \qrstu2TUR""Cz{ W}~O&0.9299240239 0.8770276033 0.893220054 \Z2]"?$z{ _}~O'0.5266666667 0.4207218733 0.4533202387w by& {|f_$270F9D7A-1B77-4611-8479-15CE692914EF h=ijk(,0 2u) y*{ au~ZNSContents)+  P  2- j,.{ a-/  Tname $'21 k02 a  1> ?@_{{189, 63}, {128, 75}} Y69p \qrsu3R7ށ8"Cz{ }~O0.79 0.63108281 0.679980358z{ }~O&0.9299240239 0.8770276033 0.893220054 \3"?ށ:z{ }~O'0.5266666667 0.4207218733 0.4533202387w y< {|Հ_$29E8FC6E-8B91-4E6B-B147-0B6B6FB0F22B =ځ>BF 3?ހ@_/XDPPCompartmentGraphicNameCompartmentIdentifier >A a  @  3CހD_5XDPPCompartmentGraphicAttributesCompartmentIdentifier BE a  D  3HGހI_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships FJ a  I> ?@_{{207, 168}, {128, 210}} &Y'(NQp \qrs+u4./ROP"Cz{ 1}~O0.79 0.63108281 0.679980358z{ 4}~O&0.9299240239 0.8770276033 0.893220054 \74:"?Rz{ <}~O'0.5266666667 0.4207218733 0.4533202387w ?yT {|C_$22ABA8CE-43F9-4BF9-9C09-A21136F81111 E=FGHVZ^ O4RWX_/XDPPCompartmentGraphicNameCompartmentIdentifier FWVY aR  X  f4i[\_5XDPPCompartmentGraphicAttributesCompartmentIdentifier GnZ] ai  \ z}4`_a_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships H^b a  a> ?@?@ABCDE FGHPRteikpf's0_{{335, 369.5}, {70, 6}} Yg [\]^5ahd cde #@ # w yj {|_$1F38AC2C-B07B-4045-947F-CC319F26B0C2 \a5mnl "A"?"do_XDDoubleArrowsLineEnd]Double Arrows\{335, 369.5} €OHA@@A@AA@@AA@#@ \a5̀q"A"?"dr\{405, 375.5} ҀO$A@@A@#@ \45$d \25$d_{{412, 3}, {128, 148}} Y߁wzp \qrsu6Rxjy"Cz{ }~O0.79 0.63108281 0.679980358z{ }~O&0.9299240239 0.8770276033 0.893220054 \6"?j{z{ }~O'0.5266666667 0.4207218733 0.4533202387w y} {|_$046B785B-9778-40CB-BD55-333D9EAAB8A9 = 6 j_/XDPPCompartmentGraphicNameCompartmentIdentifier  a     6 j_5XDPPCompartmentGraphicAttributesCompartmentIdentifier % a    1467j_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships = a7  > ?@_{{576, 90}, {128, 103}} KYLMp \qrsu7STRx"Cz{ V}~O&0.9299240239 0.8770276033 0.893220054 \Y7\"?z{ ^}~O'0.5266666667 0.4207218733 0.4533202387w ay {|e_$06125917-E6DC-4F89-B905-B33CB035D11E g=hij 7t hx at    7 i a   147 { a~+  > ?@_{{565, 0}, {128, 73}} Yp \qrsu8Rx"Cz{ }~O&0.9299240239 0.8770276033 0.893220054 \8"?z{ }~O'0.5266666667 0.4207218733 0.4533202387w y {|̀_$E6DE9B3E-DFAD-4AF5-A879-1D77E834A0EE =ҁ 8܁ { a~+    8  a   148   { a ~+  > ?@_{{214, 432}, {128, 133}} Yp \qrs!u9$%R#"z{ '}~O0.79 0.63108281 0.679980358z{ *}~O'0.9299303818 0.8770276033 0.8932184645 \-90"?#z{ 2}~O'0.5266666667 0.4207218733 0.4533202387w 5y {|9_$BD7DB0ED-6323-4117-8DAB-9BAACC510D59 ;=<=>Ł E9H#_/XDPPCompartmentGraphicNameCompartmentIdentifier M{ aH~+    ]9`€#_5XDPPCompartmentGraphicAttributesCompartmentIdentifier e{ a`~Á+   ru9xǁƀ#_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships ~{ ax~ȁ+  > ?@_{{405, 414}, {128, 116}} Ýπp \qrs!u:R6"z{ }~O'0.9299303818 0.8770276033 0.8932184645 \:"?6z{ }~O'0.5266666667 0.4207218733 0.4533202387w yҀ {|_$9B48C1F7-E989-4349-B4CF-7B4D3DF462DC =ԁׁځ݁ E:6 { a~Ձ+    ]:΁€6 ҁ{ a~؁+   ru:ǁƀ6 { a~ہ+   :߁ހ6_ ?@H ?EAB    R _{{574, 225}, {173, 58}} Y  p \qrs u; # $R"z{ &}~O0.79 0.63108281 0.679980358z{ )}~O0.93 0.8770276033 0.893326786 \ ,; /"?z{ 1}~O'0.5266666667 0.4207218733 0.4533202387w 4y {| 8_$664F8C2B-76D8-4E69-AB33-8EB93F379892 := ; < =  D; G_/XDPPCompartmentGraphicNameCompartmentIdentifier  ; L a G     [; ^_5XDPPCompartmentGraphicAttributesCompartmentIdentifier  < c a ^    o r; u_8XDPPCompartmentGraphicRelationshipsCompartmentIdentifier]Relationships  {{ a u~+  > ?@FHCG @?EAB  aP    ' _D{{540, 138.39837398373982}, {90.27118644067798, 86.601626016260184}} Y  [\]^ <a cde #@ # w y {| _$F7C8DB46-309B-4D23-A6B7-57F4C079C7C5 \ a < "A"?"_XDEmptyArrowLineEnd[Empty Arrow_{540, 138.39837398373982}_){-90.27118644067798, -86.601626016260184} O-A@@A@ \6@Boqvxz|~Ertvxz|)2?ACERTVX"%'):<>@MOXajlnwy"/1ajwy{}  9BEGIZ\^`mox &35\e  =@BEGJMPRUbdfh      / 1 3 5 B D M V _ a c l n !! !1!:!g!i!k!m!o!q!v!{!!!!!!!!!!!!!!!!!")"+"-"/"1"3"5"7"9";"="Y"b"e"g"i"z"|"~"""""""""""# #######!#&#(#*#B#P#]#j#l#########$$$$ $$$$&$M$V$c$e$g$i$v$x$z$|$$$$$$$$$$$$$$$$$%%%%%%%%%.%0%2%;%=%d%%%%%%%%%%%%%%%%&;&D&q&s&u&w&y&{&&&&&&&&&&' ' '''>'A'C'F'H'K'N'Q'S'V'c'e'g'i'''''''''''''''''''''(( (((((((*(Q(~((((((((((((((()()1)^)`)b)d)f)h)m)r)w)y){))))))))))))))*******5*A*S*e*x*z*|*~************++++?+H+h+t+++++++++++,,,,+,2,@,O,X,Z,\,e,g,,,,,,,,,,---)-=-Q-V-Y-[-^-`-c-e-g-j--------...#.-.J.R.f.r...................// ///*/6/D/L/N/Q/S/V/Y/`/v/////////////////00$01080A0U0Z0n0v0000000000000111*1-10131`1c1e1h1k1m1p1s1u1x1111111111122 222>2@2C2F2H2K2N2P2S2\2k2r2{2222222222233)32373:3=3?3X3Z3\3^3a3f3s333333333344444484A4H4K4N4Q4T4y4|4~4444444444444444444444555"5%5'5*5,5.515>5A5D5G5x5z5}5555555555555555555556666666"6$6'60636L6U6Z6]6`6b6{6~666666666677 7 7777H7J7S7V7X7a7c7777777777777777888!8$8'8T8V8Y8\8^8a8d8f8i8888888888888899 9#9&9(9+9.90939X9[9^9a9c9f9h9j9m999999999:::: : ::::5:>:C:F:I:K:d:g:i:k:n:s:::::::::::;;1;3;<;?;A;J;L;s;|;;;;;;;;;;;;;;;<< < <<=>>4>6>9><>?>B>E>H>J>M>O>T>n>w>z>}>>>>>>>>>>>>>>>?&?)?,?.?1?3?8?=?B?E?H?`?n?{????@ @ @@@@@@ @%@(@+@8@E@G@n@w@@@@@@@@@@@@@@@@@@@@AA"A$A1AZA\AqAvAxAzA}AAAAAAAAAABB B BBB7B:BGoGqGtGwGzG|GGGGGGGGGGGGGGGGGGGHH!H6H;H=H?HBHOHyH{HHHHHHHHHHHHHHIIII I I III I"I%IVIXI[I^IaIcIfIiIlInIIIIIIIIIIIIIIIIIIIIIJJ%J(J+J.J0J3J5J7J:JGJJJLJOJJJJJJJJJJJJJJJJJJJJJJJJK K)K+K8KbKdKyK~KKKKKKKKKKKKLLLLLLL?LBLDLGLILLLNLPLSLLLLLLLLLLLLLLLMM MMMMMMMMUMbMeMgMjMMMMMMMMMMMMMMMMMMMN(N6NCNFNHNKN|N~NNNNNNNNNNNNNNNNNNNNNNOO0O2OGOLONOPOSO`OOOOOOOOOOOOOOOPPPPPPP!P#P&P3P6P8P;PlPnPqPtPwPyP|PPPPPPPPPPPPPPPPQQQ Q QQQQQQQAQDQGQJQLQOQQQSQVQcQfQhQkQQQQQQQQQQQQQQQQQQQR-RBRORRRTRWRRRRRRRRRRRRRRRRRRRRRRS SSSSS!S:S=S?SBSESJSWSvSxSSSSSSSSSTTT TTTTTCTLTSTVTYT\T_TTTTTTTTTTTTTTUUUUUUUU U#UHUKUNUQUSUVUYU[U^UUUUUUUUUUUUUUVVVVVV!V$V&V)VdVrVVVVVVVVVVVVVVVVW W WWWWWWWW!WhWqWtWwWyWWWWWWWWWWWWWWX X#X&X(X+X.X3X8X=X@XCXYXeXXXXXXXXXY Y YYYY-Y2YEYRYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZ ZZZZZZZ Z#Z&Z)Z,Z/Z2Z5Z8Z;Z>ZAZDZGZLZQZVZ[Z`ZeZjZoZtZyZ~ZZZZZZZZZZZZZZZZZZ[[[[[! [#MediaLibraryKit.xcodeproj/000077500000000000000000000000001250533726500160765ustar00rootroot00000000000000MediaLibraryKit.xcodeproj/project.pbxproj000066400000000000000000001033451250533726500211600ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 7D0EF4A2170883940003ED47 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D0EF4A1170883940003ED47 /* Foundation.framework */; }; 7D0EF528170885130003ED47 /* MLCrashPreventer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF518170885130003ED47 /* MLCrashPreventer.m */; }; 7D0EF529170885130003ED47 /* MLFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF519170885130003ED47 /* MLFile.m */; }; 7D0EF52A170885130003ED47 /* MLFileParserQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF51B170885130003ED47 /* MLFileParserQueue.m */; }; 7D0EF52B170885130003ED47 /* MLLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF51C170885130003ED47 /* MLLabel.m */; }; 7D0EF52C170885130003ED47 /* MLMediaLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF51D170885130003ED47 /* MLMediaLibrary.m */; }; 7D0EF52D170885130003ED47 /* MLMovieInfoGrabber.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF51E170885130003ED47 /* MLMovieInfoGrabber.m */; }; 7D0EF52E170885130003ED47 /* MLShow.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF51F170885130003ED47 /* MLShow.m */; }; 7D0EF52F170885130003ED47 /* MLShowEpisode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF520170885130003ED47 /* MLShowEpisode.m */; }; 7D0EF530170885130003ED47 /* MLThumbnailerQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF522170885130003ED47 /* MLThumbnailerQueue.m */; }; 7D0EF531170885130003ED47 /* MLTitleDecrapifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF523170885130003ED47 /* MLTitleDecrapifier.m */; }; 7D0EF532170885130003ED47 /* MLTVShowEpisodesInfoGrabber.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF524170885130003ED47 /* MLTVShowEpisodesInfoGrabber.m */; }; 7D0EF533170885130003ED47 /* MLTVShowInfoGrabber.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF525170885130003ED47 /* MLTVShowInfoGrabber.m */; }; 7D0EF534170885130003ED47 /* MLURLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF526170885130003ED47 /* MLURLConnection.m */; }; 7D0EF535170885130003ED47 /* NSXMLNode_Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF527170885130003ED47 /* NSXMLNode_Additions.m */; }; 7D0EF551170885230003ED47 /* CXMLDocument_CreationExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF53A170885230003ED47 /* CXMLDocument_CreationExtensions.m */; }; 7D0EF552170885230003ED47 /* CXMLNode_CreationExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF53C170885230003ED47 /* CXMLNode_CreationExtensions.m */; }; 7D0EF553170885230003ED47 /* CXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF53E170885230003ED47 /* CXMLDocument.m */; }; 7D0EF554170885230003ED47 /* CXMLDocument_PrivateExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF540170885230003ED47 /* CXMLDocument_PrivateExtensions.m */; }; 7D0EF555170885230003ED47 /* CXMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF542170885230003ED47 /* CXMLElement.m */; }; 7D0EF556170885230003ED47 /* CXMLElement_CreationExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF544170885230003ED47 /* CXMLElement_CreationExtensions.m */; }; 7D0EF557170885230003ED47 /* CXMLElement_ElementTreeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF546170885230003ED47 /* CXMLElement_ElementTreeExtensions.m */; }; 7D0EF558170885230003ED47 /* CXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF548170885230003ED47 /* CXMLNode.m */; }; 7D0EF559170885230003ED47 /* CXMLNode_PrivateExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF54A170885230003ED47 /* CXMLNode_PrivateExtensions.m */; }; 7D0EF55A170885230003ED47 /* CXMLNode_XPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF54C170885230003ED47 /* CXMLNode_XPathExtensions.m */; }; 7D0EF55B170885230003ED47 /* CTidy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0EF54F170885230003ED47 /* CTidy.m */; }; 7D4625851A560729001A80B4 /* MediaLibrary.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 7D4625821A560729001A80B4 /* MediaLibrary.xcdatamodeld */; }; 7D8ECFE21708FEAE00A989E9 /* CXHTMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D8ECFE11708FEAE00A989E9 /* CXHTMLDocument.m */; }; 7D8ECFE51708FEC000A989E9 /* CXMLNamespaceNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D8ECFE41708FEC000A989E9 /* CXMLNamespaceNode.m */; }; 7D9E238617AEEA13008485E5 /* MLAlbumTrack.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D9E238517AEEA13008485E5 /* MLAlbumTrack.m */; }; 7D9E238817AEEA71008485E5 /* MLAlbum.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D9E238717AEEA71008485E5 /* MLAlbum.m */; }; 7D9E238917AF0711008485E5 /* MLAlbum.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D9E238117AEE9F2008485E5 /* MLAlbum.h */; }; 7D9E238A17AF0711008485E5 /* MLAlbumTrack.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D9E238417AEEA13008485E5 /* MLAlbumTrack.h */; }; A7924688170F09A30036AAF2 /* MediaLibraryKit.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF510170885130003ED47 /* MediaLibraryKit.h */; }; A7924689170F09A30036AAF2 /* MLFile.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF511170885130003ED47 /* MLFile.h */; }; A792468A170F09A30036AAF2 /* MLLabel.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF512170885130003ED47 /* MLLabel.h */; }; A792468B170F09A30036AAF2 /* MLMediaLibrary.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF513170885130003ED47 /* MLMediaLibrary.h */; }; A792468C170F09A30036AAF2 /* MLShow.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF514170885130003ED47 /* MLShow.h */; }; A792468D170F09A30036AAF2 /* MLShowEpisode.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF515170885130003ED47 /* MLShowEpisode.h */; }; A792468E170F09A30036AAF2 /* MLThumbnailerQueue.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 7D0EF521170885130003ED47 /* MLThumbnailerQueue.h */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 7D0EF49C170883940003ED47 /* Copy Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = "include/${PRODUCT_NAME}"; dstSubfolderSpec = 16; files = ( 7D9E238917AF0711008485E5 /* MLAlbum.h in Copy Files */, 7D9E238A17AF0711008485E5 /* MLAlbumTrack.h in Copy Files */, A7924688170F09A30036AAF2 /* MediaLibraryKit.h in Copy Files */, A7924689170F09A30036AAF2 /* MLFile.h in Copy Files */, A792468A170F09A30036AAF2 /* MLLabel.h in Copy Files */, A792468B170F09A30036AAF2 /* MLMediaLibrary.h in Copy Files */, A792468C170F09A30036AAF2 /* MLShow.h in Copy Files */, A792468D170F09A30036AAF2 /* MLShowEpisode.h in Copy Files */, A792468E170F09A30036AAF2 /* MLThumbnailerQueue.h in Copy Files */, ); name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 7D0EF49E170883940003ED47 /* libMediaLibraryKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMediaLibraryKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; 7D0EF4A1170883940003ED47 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 7D0EF4DF170883D80003ED47 /* MediaLibraryKit_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaLibraryKit_Prefix.pch; sourceTree = ""; }; 7D0EF508170885130003ED47 /* MLMovieInfoGrabber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLMovieInfoGrabber.h; sourceTree = ""; }; 7D0EF509170885130003ED47 /* MLTitleDecrapifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLTitleDecrapifier.h; sourceTree = ""; }; 7D0EF50A170885130003ED47 /* MLTVShowEpisodesInfoGrabber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLTVShowEpisodesInfoGrabber.h; sourceTree = ""; }; 7D0EF50B170885130003ED47 /* MLTVShowInfoGrabber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLTVShowInfoGrabber.h; sourceTree = ""; }; 7D0EF50C170885130003ED47 /* MLURLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLURLConnection.h; sourceTree = ""; }; 7D0EF50D170885130003ED47 /* NSXMLNode_Additions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLNode_Additions.h; sourceTree = ""; }; 7D0EF50E170885130003ED47 /* TheTVDBGrabber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TheTVDBGrabber.h; sourceTree = ""; }; 7D0EF510170885130003ED47 /* MediaLibraryKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaLibraryKit.h; sourceTree = ""; }; 7D0EF511170885130003ED47 /* MLFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLFile.h; sourceTree = ""; }; 7D0EF512170885130003ED47 /* MLLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLLabel.h; sourceTree = ""; }; 7D0EF513170885130003ED47 /* MLMediaLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLMediaLibrary.h; sourceTree = ""; }; 7D0EF514170885130003ED47 /* MLShow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLShow.h; sourceTree = ""; }; 7D0EF515170885130003ED47 /* MLShowEpisode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLShowEpisode.h; sourceTree = ""; }; 7D0EF517170885130003ED47 /* MLCrashPreventer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLCrashPreventer.h; sourceTree = ""; }; 7D0EF518170885130003ED47 /* MLCrashPreventer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLCrashPreventer.m; sourceTree = ""; }; 7D0EF519170885130003ED47 /* MLFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLFile.m; sourceTree = ""; }; 7D0EF51A170885130003ED47 /* MLFileParserQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLFileParserQueue.h; sourceTree = ""; }; 7D0EF51B170885130003ED47 /* MLFileParserQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLFileParserQueue.m; sourceTree = ""; }; 7D0EF51C170885130003ED47 /* MLLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLLabel.m; sourceTree = ""; }; 7D0EF51D170885130003ED47 /* MLMediaLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLMediaLibrary.m; sourceTree = ""; }; 7D0EF51E170885130003ED47 /* MLMovieInfoGrabber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLMovieInfoGrabber.m; sourceTree = ""; }; 7D0EF51F170885130003ED47 /* MLShow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLShow.m; sourceTree = ""; }; 7D0EF520170885130003ED47 /* MLShowEpisode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLShowEpisode.m; sourceTree = ""; }; 7D0EF521170885130003ED47 /* MLThumbnailerQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MLThumbnailerQueue.h; path = ../../Sources/MLThumbnailerQueue.h; sourceTree = ""; }; 7D0EF522170885130003ED47 /* MLThumbnailerQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLThumbnailerQueue.m; sourceTree = ""; }; 7D0EF523170885130003ED47 /* MLTitleDecrapifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLTitleDecrapifier.m; sourceTree = ""; }; 7D0EF524170885130003ED47 /* MLTVShowEpisodesInfoGrabber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLTVShowEpisodesInfoGrabber.m; sourceTree = ""; }; 7D0EF525170885130003ED47 /* MLTVShowInfoGrabber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLTVShowInfoGrabber.m; sourceTree = ""; }; 7D0EF526170885130003ED47 /* MLURLConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLURLConnection.m; sourceTree = ""; }; 7D0EF527170885130003ED47 /* NSXMLNode_Additions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLNode_Additions.m; sourceTree = ""; }; 7D0EF539170885230003ED47 /* CXMLDocument_CreationExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLDocument_CreationExtensions.h; sourceTree = ""; }; 7D0EF53A170885230003ED47 /* CXMLDocument_CreationExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLDocument_CreationExtensions.m; sourceTree = ""; }; 7D0EF53B170885230003ED47 /* CXMLNode_CreationExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLNode_CreationExtensions.h; sourceTree = ""; }; 7D0EF53C170885230003ED47 /* CXMLNode_CreationExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLNode_CreationExtensions.m; sourceTree = ""; }; 7D0EF53D170885230003ED47 /* CXMLDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLDocument.h; sourceTree = ""; }; 7D0EF53E170885230003ED47 /* CXMLDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLDocument.m; sourceTree = ""; }; 7D0EF53F170885230003ED47 /* CXMLDocument_PrivateExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLDocument_PrivateExtensions.h; sourceTree = ""; }; 7D0EF540170885230003ED47 /* CXMLDocument_PrivateExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLDocument_PrivateExtensions.m; sourceTree = ""; }; 7D0EF541170885230003ED47 /* CXMLElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLElement.h; sourceTree = ""; }; 7D0EF542170885230003ED47 /* CXMLElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLElement.m; sourceTree = ""; }; 7D0EF543170885230003ED47 /* CXMLElement_CreationExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLElement_CreationExtensions.h; sourceTree = ""; }; 7D0EF544170885230003ED47 /* CXMLElement_CreationExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLElement_CreationExtensions.m; sourceTree = ""; }; 7D0EF545170885230003ED47 /* CXMLElement_ElementTreeExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLElement_ElementTreeExtensions.h; sourceTree = ""; }; 7D0EF546170885230003ED47 /* CXMLElement_ElementTreeExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLElement_ElementTreeExtensions.m; sourceTree = ""; }; 7D0EF547170885230003ED47 /* CXMLNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLNode.h; sourceTree = ""; }; 7D0EF548170885230003ED47 /* CXMLNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLNode.m; sourceTree = ""; }; 7D0EF549170885230003ED47 /* CXMLNode_PrivateExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLNode_PrivateExtensions.h; sourceTree = ""; }; 7D0EF54A170885230003ED47 /* CXMLNode_PrivateExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLNode_PrivateExtensions.m; sourceTree = ""; }; 7D0EF54B170885230003ED47 /* CXMLNode_XPathExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLNode_XPathExtensions.h; sourceTree = ""; }; 7D0EF54C170885230003ED47 /* CXMLNode_XPathExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLNode_XPathExtensions.m; sourceTree = ""; }; 7D0EF54E170885230003ED47 /* CTidy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CTidy.h; sourceTree = ""; }; 7D0EF54F170885230003ED47 /* CTidy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CTidy.m; sourceTree = ""; }; 7D0EF550170885230003ED47 /* TouchXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchXML.h; sourceTree = ""; }; 7D4625831A560729001A80B4 /* MediaLibrary-2.1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MediaLibrary-2.1.xcdatamodel"; sourceTree = ""; }; 7D4625841A560729001A80B4 /* MediaLibrary-2.5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MediaLibrary-2.5.xcdatamodel"; sourceTree = ""; }; 7D8ECFE01708FEAE00A989E9 /* CXHTMLDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXHTMLDocument.h; sourceTree = ""; }; 7D8ECFE11708FEAE00A989E9 /* CXHTMLDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXHTMLDocument.m; sourceTree = ""; }; 7D8ECFE31708FEC000A989E9 /* CXMLNamespaceNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLNamespaceNode.h; sourceTree = ""; }; 7D8ECFE41708FEC000A989E9 /* CXMLNamespaceNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXMLNamespaceNode.m; sourceTree = ""; }; 7D9E238117AEE9F2008485E5 /* MLAlbum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLAlbum.h; sourceTree = ""; }; 7D9E238417AEEA13008485E5 /* MLAlbumTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLAlbumTrack.h; sourceTree = ""; }; 7D9E238517AEEA13008485E5 /* MLAlbumTrack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLAlbumTrack.m; sourceTree = ""; }; 7D9E238717AEEA71008485E5 /* MLAlbum.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLAlbum.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 7D0EF49B170883940003ED47 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7D0EF4A2170883940003ED47 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 7D0EF495170883940003ED47 = { isa = PBXGroup; children = ( 7D4625821A560729001A80B4 /* MediaLibrary.xcdatamodeld */, 7D0EF536170885230003ED47 /* TouchXML */, 7D0EF506170885130003ED47 /* Headers */, 7D0EF516170885130003ED47 /* Sources */, 7D0EF4A4170883940003ED47 /* Supporting Files */, 7D0EF4A0170883940003ED47 /* Frameworks */, 7D0EF49F170883940003ED47 /* Products */, ); sourceTree = ""; }; 7D0EF49F170883940003ED47 /* Products */ = { isa = PBXGroup; children = ( 7D0EF49E170883940003ED47 /* libMediaLibraryKit.a */, ); name = Products; sourceTree = ""; }; 7D0EF4A0170883940003ED47 /* Frameworks */ = { isa = PBXGroup; children = ( 7D0EF4A1170883940003ED47 /* Foundation.framework */, ); name = Frameworks; sourceTree = ""; }; 7D0EF4A4170883940003ED47 /* Supporting Files */ = { isa = PBXGroup; children = ( 7D0EF4DF170883D80003ED47 /* MediaLibraryKit_Prefix.pch */, ); name = "Supporting Files"; path = MediaLibraryKit; sourceTree = ""; }; 7D0EF506170885130003ED47 /* Headers */ = { isa = PBXGroup; children = ( 7D0EF507170885130003ED47 /* Internal */, 7D0EF50F170885130003ED47 /* Public */, ); path = Headers; sourceTree = ""; }; 7D0EF507170885130003ED47 /* Internal */ = { isa = PBXGroup; children = ( 7D0EF508170885130003ED47 /* MLMovieInfoGrabber.h */, 7D0EF509170885130003ED47 /* MLTitleDecrapifier.h */, 7D0EF50A170885130003ED47 /* MLTVShowEpisodesInfoGrabber.h */, 7D0EF50B170885130003ED47 /* MLTVShowInfoGrabber.h */, 7D0EF50C170885130003ED47 /* MLURLConnection.h */, 7D0EF50D170885130003ED47 /* NSXMLNode_Additions.h */, 7D0EF50E170885130003ED47 /* TheTVDBGrabber.h */, ); path = Internal; sourceTree = ""; }; 7D0EF50F170885130003ED47 /* Public */ = { isa = PBXGroup; children = ( 7D0EF510170885130003ED47 /* MediaLibraryKit.h */, 7D0EF511170885130003ED47 /* MLFile.h */, 7D0EF512170885130003ED47 /* MLLabel.h */, 7D0EF513170885130003ED47 /* MLMediaLibrary.h */, 7D0EF514170885130003ED47 /* MLShow.h */, 7D0EF515170885130003ED47 /* MLShowEpisode.h */, 7D9E238117AEE9F2008485E5 /* MLAlbum.h */, 7D9E238417AEEA13008485E5 /* MLAlbumTrack.h */, 7D0EF521170885130003ED47 /* MLThumbnailerQueue.h */, ); path = Public; sourceTree = ""; }; 7D0EF516170885130003ED47 /* Sources */ = { isa = PBXGroup; children = ( 7D0EF517170885130003ED47 /* MLCrashPreventer.h */, 7D0EF518170885130003ED47 /* MLCrashPreventer.m */, 7D0EF519170885130003ED47 /* MLFile.m */, 7D0EF51A170885130003ED47 /* MLFileParserQueue.h */, 7D0EF51B170885130003ED47 /* MLFileParserQueue.m */, 7D0EF51C170885130003ED47 /* MLLabel.m */, 7D0EF51D170885130003ED47 /* MLMediaLibrary.m */, 7D0EF51E170885130003ED47 /* MLMovieInfoGrabber.m */, 7D0EF51F170885130003ED47 /* MLShow.m */, 7D0EF520170885130003ED47 /* MLShowEpisode.m */, 7D9E238717AEEA71008485E5 /* MLAlbum.m */, 7D9E238517AEEA13008485E5 /* MLAlbumTrack.m */, 7D0EF522170885130003ED47 /* MLThumbnailerQueue.m */, 7D0EF523170885130003ED47 /* MLTitleDecrapifier.m */, 7D0EF524170885130003ED47 /* MLTVShowEpisodesInfoGrabber.m */, 7D0EF525170885130003ED47 /* MLTVShowInfoGrabber.m */, 7D0EF526170885130003ED47 /* MLURLConnection.m */, 7D0EF527170885130003ED47 /* NSXMLNode_Additions.m */, ); path = Sources; sourceTree = ""; }; 7D0EF536170885230003ED47 /* TouchXML */ = { isa = PBXGroup; children = ( 7D0EF537170885230003ED47 /* Source */, ); name = TouchXML; path = External/TouchXML; sourceTree = ""; }; 7D0EF537170885230003ED47 /* Source */ = { isa = PBXGroup; children = ( 7D0EF538170885230003ED47 /* Creation */, 7D0EF53D170885230003ED47 /* CXMLDocument.h */, 7D0EF53E170885230003ED47 /* CXMLDocument.m */, 7D0EF53F170885230003ED47 /* CXMLDocument_PrivateExtensions.h */, 7D0EF540170885230003ED47 /* CXMLDocument_PrivateExtensions.m */, 7D0EF541170885230003ED47 /* CXMLElement.h */, 7D0EF542170885230003ED47 /* CXMLElement.m */, 7D0EF543170885230003ED47 /* CXMLElement_CreationExtensions.h */, 7D0EF544170885230003ED47 /* CXMLElement_CreationExtensions.m */, 7D0EF545170885230003ED47 /* CXMLElement_ElementTreeExtensions.h */, 7D0EF546170885230003ED47 /* CXMLElement_ElementTreeExtensions.m */, 7D0EF547170885230003ED47 /* CXMLNode.h */, 7D0EF548170885230003ED47 /* CXMLNode.m */, 7D0EF549170885230003ED47 /* CXMLNode_PrivateExtensions.h */, 7D0EF54A170885230003ED47 /* CXMLNode_PrivateExtensions.m */, 7D0EF54B170885230003ED47 /* CXMLNode_XPathExtensions.h */, 7D0EF54C170885230003ED47 /* CXMLNode_XPathExtensions.m */, 7D8ECFE01708FEAE00A989E9 /* CXHTMLDocument.h */, 7D8ECFE11708FEAE00A989E9 /* CXHTMLDocument.m */, 7D8ECFE31708FEC000A989E9 /* CXMLNamespaceNode.h */, 7D8ECFE41708FEC000A989E9 /* CXMLNamespaceNode.m */, 7D0EF54D170885230003ED47 /* Tidy */, 7D0EF550170885230003ED47 /* TouchXML.h */, ); path = Source; sourceTree = ""; }; 7D0EF538170885230003ED47 /* Creation */ = { isa = PBXGroup; children = ( 7D0EF539170885230003ED47 /* CXMLDocument_CreationExtensions.h */, 7D0EF53A170885230003ED47 /* CXMLDocument_CreationExtensions.m */, 7D0EF53B170885230003ED47 /* CXMLNode_CreationExtensions.h */, 7D0EF53C170885230003ED47 /* CXMLNode_CreationExtensions.m */, ); path = Creation; sourceTree = ""; }; 7D0EF54D170885230003ED47 /* Tidy */ = { isa = PBXGroup; children = ( 7D0EF54E170885230003ED47 /* CTidy.h */, 7D0EF54F170885230003ED47 /* CTidy.m */, ); path = Tidy; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 7D0EF49D170883940003ED47 /* MediaLibraryKit */ = { isa = PBXNativeTarget; buildConfigurationList = 7D0EF4AC170883940003ED47 /* Build configuration list for PBXNativeTarget "MediaLibraryKit" */; buildPhases = ( 7D0EF49A170883940003ED47 /* Sources */, 7D0EF49B170883940003ED47 /* Frameworks */, 7D0EF49C170883940003ED47 /* Copy Files */, ); buildRules = ( ); dependencies = ( ); name = MediaLibraryKit; productName = MediaLibraryKit; productReference = 7D0EF49E170883940003ED47 /* libMediaLibraryKit.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 7D0EF496170883940003ED47 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0510; ORGANIZATIONNAME = VideoLAN; }; buildConfigurationList = 7D0EF499170883940003ED47 /* Build configuration list for PBXProject "MediaLibraryKit" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 7D0EF495170883940003ED47; productRefGroup = 7D0EF49F170883940003ED47 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 7D0EF49D170883940003ED47 /* MediaLibraryKit */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ 7D0EF49A170883940003ED47 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7D0EF528170885130003ED47 /* MLCrashPreventer.m in Sources */, 7D0EF529170885130003ED47 /* MLFile.m in Sources */, 7D0EF52A170885130003ED47 /* MLFileParserQueue.m in Sources */, 7D0EF52B170885130003ED47 /* MLLabel.m in Sources */, 7D0EF52C170885130003ED47 /* MLMediaLibrary.m in Sources */, 7D0EF52D170885130003ED47 /* MLMovieInfoGrabber.m in Sources */, 7D0EF52E170885130003ED47 /* MLShow.m in Sources */, 7D0EF52F170885130003ED47 /* MLShowEpisode.m in Sources */, 7D0EF530170885130003ED47 /* MLThumbnailerQueue.m in Sources */, 7D0EF531170885130003ED47 /* MLTitleDecrapifier.m in Sources */, 7D0EF532170885130003ED47 /* MLTVShowEpisodesInfoGrabber.m in Sources */, 7D0EF533170885130003ED47 /* MLTVShowInfoGrabber.m in Sources */, 7D0EF534170885130003ED47 /* MLURLConnection.m in Sources */, 7D9E238617AEEA13008485E5 /* MLAlbumTrack.m in Sources */, 7D9E238817AEEA71008485E5 /* MLAlbum.m in Sources */, 7D0EF535170885130003ED47 /* NSXMLNode_Additions.m in Sources */, 7D0EF551170885230003ED47 /* CXMLDocument_CreationExtensions.m in Sources */, 7D0EF552170885230003ED47 /* CXMLNode_CreationExtensions.m in Sources */, 7D0EF553170885230003ED47 /* CXMLDocument.m in Sources */, 7D0EF554170885230003ED47 /* CXMLDocument_PrivateExtensions.m in Sources */, 7D0EF555170885230003ED47 /* CXMLElement.m in Sources */, 7D0EF556170885230003ED47 /* CXMLElement_CreationExtensions.m in Sources */, 7D4625851A560729001A80B4 /* MediaLibrary.xcdatamodeld in Sources */, 7D0EF557170885230003ED47 /* CXMLElement_ElementTreeExtensions.m in Sources */, 7D0EF558170885230003ED47 /* CXMLNode.m in Sources */, 7D0EF559170885230003ED47 /* CXMLNode_PrivateExtensions.m in Sources */, 7D0EF55A170885230003ED47 /* CXMLNode_XPathExtensions.m in Sources */, 7D0EF55B170885230003ED47 /* CTidy.m in Sources */, 7D8ECFE21708FEAE00A989E9 /* CXHTMLDocument.m in Sources */, 7D8ECFE51708FEC000A989E9 /* CXMLNamespaceNode.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 7D0EF4AA170883940003ED47 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/External/MobileVLCKit/include/MobileVLCKit/**", ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 7D0EF4AB170883940003ED47 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "$(SRCROOT)/External/MobileVLCKit/include/MobileVLCKit/**", ); IPHONEOS_DEPLOYMENT_TARGET = 5.1; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 7D0EF4AD170883940003ED47 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( "$(ARCHS_STANDARD)", armv7s, ); CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/MediaLibraryKit.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MediaLibraryKit_Prefix.pch; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/External/MobileVLCKit/include\"", /usr/include/libxml2, ); IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/External/MobileVLCKit\""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Debug; }; 7D0EF4AE170883940003ED47 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( "$(ARCHS_STANDARD)", armv7s, ); CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/MediaLibraryKit.dst; ENABLE_NS_ASSERTIONS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MediaLibraryKit_Prefix.pch; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/External/MobileVLCKit/include\"", /usr/include/libxml2, ); IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/External/MobileVLCKit\""; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 7D0EF499170883940003ED47 /* Build configuration list for PBXProject "MediaLibraryKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D0EF4AA170883940003ED47 /* Debug */, 7D0EF4AB170883940003ED47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7D0EF4AC170883940003ED47 /* Build configuration list for PBXNativeTarget "MediaLibraryKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D0EF4AD170883940003ED47 /* Debug */, 7D0EF4AE170883940003ED47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ 7D4625821A560729001A80B4 /* MediaLibrary.xcdatamodeld */ = { isa = XCVersionGroup; children = ( 7D4625831A560729001A80B4 /* MediaLibrary-2.1.xcdatamodel */, 7D4625841A560729001A80B4 /* MediaLibrary-2.5.xcdatamodel */, ); currentVersion = 7D4625841A560729001A80B4 /* MediaLibrary-2.5.xcdatamodel */; path = MediaLibrary.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; /* End XCVersionGroup section */ }; rootObject = 7D0EF496170883940003ED47 /* Project object */; } MediaLibraryKit_Prefix.pch000066400000000000000000000037121250533726500161160ustar00rootroot00000000000000/***************************************************************************** * MobileMediaLibraryKit_Prefix.pch * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifdef __OBJC__ #import #endif #import #if TARGET_OS_IPHONE // FIXME #define HAVE_BLOCK 0 #define NSXMLDocument CXMLDocument #define NSXMLNode CXMLNode #import "TouchXML.h" #import #import #else #define HAVE_BLOCK 1 #import #endif #import "NSXMLNode_Additions.h" #ifndef NDEBUG #define APLog(format, ...) NSLog(format, ## __VA_ARGS__) #else #define APLog(format, ...) #endif #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) #ifdef __IPHONE_7_0 #define SYSTEM_RUNS_IOS7 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0") #else #define SYSTEM_RUNS_IOS7 NO #endif NEWS000066400000000000000000000067661250533726500116040ustar00rootroot00000000000000Version 2.5 ----------- - Updated database format allowing more meta data - Stability improvements Version 2.4 ----------- - NEW: code was upgraded to ARC - FIX: library is no longer reset when upgrading iOS app through the store - FIX: [] pattern is correctly removed from file titles Added Public APIs: - MLMediaLibrary - new selector: documentFolderPath Version 2.3 ----------- - FIX: crash when deploying MLFile's unread property Added Public APIs: - MLFile: - new selectors: fileForURL folderTrackNumber - MLLabel: - new selector: sortedFolderItems - MLMediaLibrary: - new selector: removeObject Version 2.2.1 ------------- - FIX: incorrect return value for untitled TV shows - FIX: crash in setter/getter for lastPosition and unread in MLFile - Thumbnailer: use a special libVLC instance for thumbnails Version 2.2 ----------- - FIX: correct subitem behavior of MLShow and MLAlbum on removal - FIX: MLTitleDecrapifier handles shows with more than 99 and less than 1000 episodes correctly now - NEW: added user defaults option to disable file name display optimizations when media is newly added to the library - FIX: thumbnails are correctly purged if a media item is removed Added Public APIs: - MLShow: - new selectors: removeEpisode: removeEpisodeWithSeasonNumber:andEpisodeNumber: sortedEpisodes - MLAlbum: - new selectors: removeTrack: removeTrackWithTrackNumber: sortedTracks - MLLabel: - new selector: allLabels Version 2.1.3 ------------- - fix crash when processing files whose names are less than 6 characters long (after removing the file extension) Version 2.1.2 ------------- - fix crashes and missing exception handlings - fix memory leaks in MLFile, library and title sanitizer - prevent zombie creation and VLCMedia corruptions Version 2.1.1 ------------- - improved title decrapification with faster processing and support for older TV show naming schemes - improve notifications of some properties Version 2.1 ----------- Features: - added support for audio file detection and album organization - improved title decrapification including advanced TV Show support - overall stability improvements - updated database format including a future-proof upgrade API Added Public APIs: - MLAlbum: - New class - MLAlbumTrack: - New class - MLFile: - new properties: lastAudioTrack, lastSubtitleTrack - MLMediaLibrary: - new properties: delegate, libraryNeedsUpgrade - new selector: upgradeLibrary - new delegate protocol: libraryUpgradeComplete Version 2.0 ----------- The entire library was cleaned and relicensed to LGPL 2.1 or later. Please note that the Objective-C syntax was updated, so MediaLibraryKit may no longer compile with outdated versions of Xcode / clang. Features: - added automatic support for HiDPI thumbnails depending on the iOS device the client app is executed on Added APIs: - MediaLibraryKit: - added a generic header to include the entire framework's functionality with a single #import - MLMediaLibrary: - (void)updateMediaDatabase; Removed APIs and code: - MLMediaLibrary: - (void)updateDatabase; - NameCleaner.rb Modified behavior and misc: - use of clang instead of llvm-gcc-4.2 - updated project file for Xcode 4.3 and later - iOS Deployment target was raised to iOS 5.1 - different logging behavior: to see any debug messages, the framework needs to be compiled in debug mode. - fixed a significant number of memory leaks - updated TouchXML snapshot to current HEAD Sources/000077500000000000000000000000001250533726500125115ustar00rootroot00000000000000Sources/MLAlbum.m000066400000000000000000000072131250533726500141630ustar00rootroot00000000000000/***************************************************************************** * MLAlbum.m ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul Kühne * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLAlbum.h" #import "MLAlbumTrack.h" #import "MLMediaLibrary.h" @implementation MLAlbum + (NSArray *)allAlbums { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Album" inManagedObjectContext:moc]; [request setEntity:entity]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; [request setSortDescriptors:@[descriptor]]; NSArray *albums = [moc executeFetchRequest:request error:nil]; return albums; } + (MLAlbum *)albumWithName:(NSString *)name { NSFetchRequest *request = [[MLMediaLibrary sharedMediaLibrary] fetchRequestForEntity:@"Album"]; [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", name]]; NSArray *dbResults = [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] executeFetchRequest:request error:nil]; NSAssert(dbResults, @"Can't execute fetch request"); if ([dbResults count] <= 0) return nil; return dbResults[0]; } @dynamic name; @dynamic releaseYear; @dynamic tracks; @dynamic unreadTracks; - (NSArray *)sortedTracks { NSArray *tracks = [[self valueForKey:@"tracks"] allObjects]; NSSortDescriptor *trackNumberDescriptor = [[NSSortDescriptor alloc] initWithKey:@"trackNumber" ascending:YES selector:@selector(compare:)]; return [tracks sortedArrayUsingDescriptors:@[trackNumberDescriptor]]; } - (void)removeTrack:(MLAlbumTrack *)track { if (!track) return; NSMutableSet *tracks = [self mutableSetValueForKey:@"tracks"]; [tracks removeObject:track]; [self willChangeValueForKey:@"tracks"]; [self setValue:tracks forKey:@"tracks"]; [self didChangeValueForKey:@"tracks"]; } - (void)removeTrackWithNumber:(NSNumber *)trackNumber { NSMutableSet *tracks = [self mutableSetValueForKey:@"tracks"]; MLAlbumTrack *track = nil; if (trackNumber) { for (MLAlbumTrack *trackIter in tracks) { if ([trackIter.trackNumber intValue] == [trackNumber intValue]) { track = trackIter; break; } } } if (!track) return; [tracks removeObject:track]; [self willChangeValueForKey:@"tracks"]; [self setValue:tracks forKey:@"tracks"]; [self didChangeValueForKey:@"tracks"]; } @end Sources/MLAlbumTrack.m000066400000000000000000000074301250533726500151510ustar00rootroot00000000000000/***************************************************************************** * MLAlbumTrack.m ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul Kühne * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLMediaLibrary.h" #import "MLAlbumTrack.h" #import "MLAlbum.h" @interface MLAlbumTrack () @property (nonatomic, strong) NSNumber *primitiveUnread; @end @implementation MLAlbumTrack + (NSArray *)allTracks { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"AlbumTrack" inManagedObjectContext:moc]; [request setEntity:entity]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; [request setSortDescriptors:@[descriptor]]; [request setPredicate:[NSPredicate predicateWithFormat:@"files.@count > 0"]]; NSArray *tracks = [moc executeFetchRequest:request error:nil]; return tracks; } + (MLAlbumTrack *)trackWithAlbum:(id)album trackNumber:(NSNumber *)trackNumber createIfNeeded:(BOOL)createIfNeeded { NSMutableSet *tracks = [album mutableSetValueForKey:@"tracks"]; MLAlbumTrack *track = nil; if (trackNumber) { for (MLAlbumTrack *trackIter in tracks) { if ([trackIter.trackNumber intValue] == [trackNumber intValue]) { track = trackIter; break; } } } if (!track && createIfNeeded) { track = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"AlbumTrack"]; track.trackNumber = trackNumber; [tracks addObject:track]; } return track; } + (MLAlbumTrack *)trackWithAlbumName:(NSString *)albumName trackNumber:(NSNumber *)trackNumber createIfNeeded:(BOOL)createIfNeeded wasCreated:(BOOL *)wasCreated { MLAlbum *album = [MLAlbum albumWithName:albumName]; *wasCreated = NO; if (!album && createIfNeeded) { *wasCreated = YES; album = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"Album"]; album.name = albumName ? albumName : @""; } else if (!album && !createIfNeeded) return nil; return [MLAlbumTrack trackWithAlbum:album trackNumber:trackNumber createIfNeeded:createIfNeeded]; } @dynamic primitiveUnread; @dynamic unread; - (void)setUnread:(NSNumber *)unread { [self willChangeValueForKey:@"unread"]; [self setPrimitiveUnread:unread]; [self didChangeValueForKey:@"unread"]; [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] refreshObject:[self album] mergeChanges:YES]; [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] refreshObject:self mergeChanges:YES]; } @dynamic artist; @dynamic genre; @dynamic title; @dynamic trackNumber; @dynamic album; @dynamic files; @end Sources/MLCrashPreventer.h000066400000000000000000000026441250533726500160540ustar00rootroot00000000000000/***************************************************************************** * MLCrashPreventer.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @class MLFile; @interface MLCrashPreventer : NSObject + (id)sharedPreventer; - (void)cancelAllFileParse; - (void)markCrasherFiles; - (BOOL)isFileSafe:(MLFile *)file; - (void)willParseFile:(MLFile *)file; - (void)didParseFile:(MLFile *)file; @end Sources/MLCrashPreventer.m000066400000000000000000000062371250533726500160630ustar00rootroot00000000000000/***************************************************************************** * MLCrashPreventer.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLCrashPreventer.h" #import "MLThumbnailerQueue.h" #import "MLFileParserQueue.h" #import "MLCrashPreventer.h" #import "MLFile.h" #import "MLMediaLibrary.h" @interface MLCrashPreventer () { NSMutableArray *_parsedFiles; } @end @implementation MLCrashPreventer + (id)sharedPreventer { static MLCrashPreventer *crashPreventer; if (!crashPreventer) crashPreventer = [[MLCrashPreventer alloc] init]; // Use the same queue for the two objects, because we wan't to track accurately // which operation causes a crash. [MLThumbnailerQueue sharedThumbnailerQueue].queue = [MLFileParserQueue sharedFileParserQueue].queue; return crashPreventer; } - (id)init { self = [super init]; if (self) _parsedFiles = [[NSMutableArray alloc] init]; return self; } - (void)dealloc { NSAssert([_parsedFiles count] == 0, @"You should call -cancelAllFileParse before releasing"); } - (void)cancelAllFileParse { APLog(@"Cancelling file parsing"); for (MLFile *file in _parsedFiles) file.isBeingParsed = NO; [_parsedFiles removeAllObjects]; [[MLMediaLibrary sharedMediaLibrary] save]; } - (void)markCrasherFiles { for (MLFile *file in [MLFile allFiles]) { if ([file isBeingParsed]) { file.isSafe = NO; file.isBeingParsed = NO; } } [[MLMediaLibrary sharedMediaLibrary] save]; } - (BOOL)isFileSafe:(MLFile *)file { return file.isSafe; } - (void)willParseFile:(MLFile *)file { NSAssert([MLThumbnailerQueue sharedThumbnailerQueue].queue == [MLFileParserQueue sharedFileParserQueue].queue, @""); NSAssert([_parsedFiles count] < 1, @"Parsing multiple files at the same time. Crash preventer can't work accurately."); file.isBeingParsed = YES; // Force to save the media library in case of crash. [[MLMediaLibrary sharedMediaLibrary] save]; [_parsedFiles addObject:file]; } - (void)didParseFile:(MLFile *)file { file.isBeingParsed = NO; [_parsedFiles removeObject:file]; } @end Sources/MLFile.m000066400000000000000000000266331250533726500140110ustar00rootroot00000000000000/***************************************************************************** * MLFile.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLFile.h" #import "MLShow.h" #import "MLShowEpisode.h" #import "MLAlbum.h" #import "MLAlbumTrack.h" #import "MLMediaLibrary.h" #import "MLThumbnailerQueue.h" NSString *kMLFileTypeMovie = @"movie"; NSString *kMLFileTypeClip = @"clip"; NSString *kMLFileTypeTVShowEpisode = @"tvShowEpisode"; NSString *kMLFileTypeAudio = @"audio"; @implementation MLFile - (NSString *)description { return [NSString stringWithFormat:@"", [self title]]; } + (NSArray *)allFiles { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:moc]; [request setEntity:entity]; [request setPredicate:[NSPredicate predicateWithFormat:@"isOnDisk == YES"]]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; [request setSortDescriptors:@[descriptor]]; NSError *error; NSArray *movies = [moc executeFetchRequest:request error:&error]; if (!movies) { APLog(@"WARNING: %@", error); } return movies; } + (NSArray *)fileForURL:(NSString *)url; { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:moc]; [request setEntity:entity]; [request setPredicate:[NSPredicate predicateWithFormat:@"url == %@", url]]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; [request setSortDescriptors:@[descriptor]]; NSError *error; NSArray *files = [moc executeFetchRequest:request error:&error]; if (!files) APLog(@"WARNING: %@", error); return files; } - (BOOL)isKindOfType:(NSString *)type { return [self.type isEqualToString:type]; } - (BOOL)isMovie { return [self isKindOfType:kMLFileTypeTVShowEpisode]; } - (BOOL)isClip { return [self isKindOfType:kMLFileTypeTVShowEpisode]; } - (BOOL)isShowEpisode { return [self isKindOfType:kMLFileTypeTVShowEpisode]; } - (BOOL)isAlbumTrack { return [self isKindOfType:kMLFileTypeAudio]; } - (BOOL)isSupportedAudioFile { NSUInteger options = NSRegularExpressionSearch | NSCaseInsensitiveSearch; return ([[self.url lastPathComponent] rangeOfString:@"\\.(aac|aiff|aif|amr|aob|ape|axa|caf|flac|it|m2a|m4a|m4b|mka|mlp|mod|mp1|mp2|mp3|mpa|mpc|oga|oma|opus|rmi|s3m|spx|tta|voc|vqf|w64|wav|wma|wv|xa|xm)$" options:options].location != NSNotFound); } - (NSString *)artworkURL { if ([self isShowEpisode]) { return self.showEpisode.artworkURL; } return [self primitiveValueForKey:@"artworkURL"]; } - (NSString *)title { if ([self isShowEpisode]) { MLShowEpisode *episode = self.showEpisode; NSMutableString *name = [[NSMutableString alloc] init]; if (episode.show.name.length > 0) [name appendString:episode.show.name]; if ([episode.seasonNumber intValue] > 0) { if (![name isEqualToString:@""]) [name appendString:@" - "]; [name appendFormat:@"S%02dE%02d", [episode.seasonNumber intValue], [episode.episodeNumber intValue]]; } if (episode.name.length > 0) { if ([name length] > 0) [name appendString:@" - "]; [name appendString:episode.name]; } NSString *returnValue = [NSString stringWithString:name]; return returnValue; } else if ([self isAlbumTrack]) { MLAlbumTrack *track = self.albumTrack; if (track && track.title.length > 0) { NSMutableString *name = [[NSMutableString alloc] initWithString:track.title]; if (track.album.name.length > 0) [name appendFormat:@" - %@", track.album.name]; if (track.artist.length > 0) [name appendFormat:@" - %@", track.artist]; NSString *returnValue = [NSString stringWithString:name]; return returnValue; } } [self willAccessValueForKey:@"title"]; NSString *ret = [self primitiveValueForKey:@"title"]; [self didAccessValueForKey:@"title"]; return ret; } @dynamic seasonNumber; @dynamic remainingTime; @dynamic releaseYear; @dynamic lastSubtitleTrack; @dynamic lastAudioTrack; @dynamic playCount; @dynamic artworkURL; @dynamic type; @dynamic title; @dynamic shortSummary; @dynamic currentlyWatching; @dynamic episodeNumber; @dynamic hasFetchedInfo; @dynamic noOnlineMetaData; @dynamic showEpisode; @dynamic labels; @dynamic tracks; @dynamic isOnDisk; @dynamic duration; @dynamic artist; @dynamic album; @dynamic albumTrackNumber; @dynamic folderTrackNumber; @dynamic genre; @dynamic albumTrack; @dynamic unread; - (NSNumber *)lastPosition { [self willAccessValueForKey:@"lastPosition"]; NSNumber *ret = [self primitiveValueForKey:@"lastPosition"]; [self didAccessValueForKey:@"lastPosition"]; return ret; } - (void)setLastPosition:(NSNumber *)lastPosition { @try { [self willChangeValueForKey:@"lastPosition"]; [self setPrimitiveValue:lastPosition forKey:@"lastPosition"]; [self didChangeValueForKey:@"lastPosition"]; } @catch (NSException *exception) { APLog(@"setLastPosition raised exception"); } } - (NSString *)url { [self willAccessValueForKey:@"url"]; NSString *ret = [self primitiveValueForKey:@"url"]; [self didAccessValueForKey:@"url"]; /* we need to make sure that current app path is still part of the file * URL since app upgrades via iTunes or the App Store will change the * absolute URL of our files (trac #11330) */ NSString *documentFolderPath = [[MLMediaLibrary sharedMediaLibrary] documentFolderPath]; if ([ret rangeOfString:documentFolderPath].location != NSNotFound) return ret; NSArray *pathComponents = [ret componentsSeparatedByString:@"/"]; NSUInteger componentCount = pathComponents.count; if ([pathComponents[componentCount - 2] isEqualToString:@"Documents"]) ret = [NSString stringWithFormat:@"%@/%@", documentFolderPath, [ret lastPathComponent]]; else { NSUInteger firstElement = [pathComponents indexOfObject:@"Documents"] + 1; ret = documentFolderPath; for (NSUInteger x = 0; x < componentCount - firstElement; x++) ret = [ret stringByAppendingFormat:@"/%@", pathComponents[firstElement + x]]; } APLog(@"returning modified URL! will return %@", ret); return ret; } - (void)setUrl:(NSString *)url { @try { [self willChangeValueForKey:@"url"]; [self setPrimitiveValue:url forKey:@"url"]; [self didChangeValueForKey:@"url"]; } @catch (NSException *exception) { APLog(@"setUrl raised exception"); } } - (NSString *)thumbnailPath { NSString *folder = [[MLMediaLibrary sharedMediaLibrary] thumbnailFolderPath]; NSURL *url = [[self objectID] URIRepresentation]; return [[folder stringByAppendingPathComponent:[url path]] stringByAppendingString:@".png"]; } - (UIImage *)computedThumbnail { return [UIImage imageWithContentsOfFile:[self thumbnailPath]]; } - (void)setComputedThumbnail:(UIImage *)image { NSURL *url = [NSURL fileURLWithPath:[self thumbnailPath]]; NSFileManager *manager = [NSFileManager defaultManager]; [manager createDirectoryAtPath:[[self thumbnailPath] stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil]; if (!image) { [manager removeItemAtURL:url error:nil]; return; } [UIImagePNGRepresentation(image) writeToURL:url atomically:YES]; } - (BOOL)isSafe { [self willAccessValueForKey:@"isSafe"]; NSNumber *ret = [self primitiveValueForKey:@"isSafe"]; [self didAccessValueForKey:@"isSafe"]; return [ret boolValue]; } - (void)setIsSafe:(BOOL)isSafe { @try { [self willChangeValueForKey:@"isSafe"]; [self setPrimitiveValue:@(isSafe) forKey:@"isSafe"]; [self didChangeValueForKey:@"isSafe"]; } @catch (NSException *exception) { APLog(@"setIsSafe raised exception"); } } - (BOOL)isBeingParsed { [self willAccessValueForKey:@"isBeingParsed"]; NSNumber *ret = [self primitiveValueForKey:@"isBeingParsed"]; [self didAccessValueForKey:@"isBeingParsed"]; return [ret boolValue]; } - (void)setIsBeingParsed:(BOOL)isBeingParsed { @try { [self willChangeValueForKey:@"isBeingParsed"]; [self setPrimitiveValue:@(isBeingParsed) forKey:@"isBeingParsed"]; [self didChangeValueForKey:@"isBeingParsed"]; } @catch (NSException *exception) { APLog(@"setIsBeingParsed raised exception"); } } - (BOOL)thumbnailTimeouted { [self willAccessValueForKey:@"thumbnailTimeouted"]; NSNumber *ret = [self primitiveValueForKey:@"thumbnailTimeouted"]; [self didAccessValueForKey:@"thumbnailTimeouted"]; return [ret boolValue]; } - (void)setThumbnailTimeouted:(BOOL)thumbnailTimeouted { @try { [self willChangeValueForKey:@"thumbnailTimeouted"]; [self setPrimitiveValue:@(thumbnailTimeouted) forKey:@"thumbnailTimeouted"]; [self didChangeValueForKey:@"thumbnailTimeouted"]; } @catch (NSException *exception) { APLog(@"setThumbnailTimeouted raised exception"); } } - (void)willDisplay { [[MLThumbnailerQueue sharedThumbnailerQueue] setHighPriorityForFile:self]; } - (void)didHide { [[MLThumbnailerQueue sharedThumbnailerQueue] setDefaultPriorityForFile:self]; } - (NSManagedObject *)videoTrack { NSSet *tracks = [self tracks]; if (!tracks) return nil; for (NSManagedObject *track in tracks) { if ([[[track entity] name] isEqualToString:@"VideoTrackInformation"]) return track; } return nil; } - (size_t)fileSizeInBytes { NSFileManager *manager = [NSFileManager defaultManager]; NSDictionary *fileAttributes = [manager attributesOfItemAtPath:[[[NSURL URLWithString:self.url] path] stringByResolvingSymlinksInPath] error:nil]; NSNumber *fileSize = fileAttributes[NSFileSize]; return [fileSize unsignedLongLongValue]; } @end Sources/MLFileParserQueue.h000066400000000000000000000027551250533726500161650ustar00rootroot00000000000000/***************************************************************************** * MLFileParserQueue.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @class MLFile; @interface MLFileParserQueue : NSObject + (MLFileParserQueue *)sharedFileParserQueue; - (void)addFile:(MLFile *)file; - (void)setHighPriorityForFile:(MLFile *)file; - (void)setDefaultPriorityForFile:(MLFile *)file; - (void)stop; - (void)resume; @property (nonatomic, strong) NSOperationQueue *queue; @end Sources/MLFileParserQueue.m000066400000000000000000000202421250533726500161610ustar00rootroot00000000000000/***************************************************************************** * MLFileParserQueue.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLFileParserQueue.h" #import "MLFile.h" #import "MLMediaLibrary.h" #import "MLCrashPreventer.h" #import "MLAlbumTrack.h" #import "MLAlbum.h" #import "MLTitleDecrapifier.h" @interface MLFileParserQueue () { NSDictionary *_fileDescriptionToOperation; NSOperationQueue *_queue; } @end @interface MLParsingOperation : NSOperation { MLFile *_file; VLCMedia *_media; } @property (strong,readwrite) MLFile *file; @end @interface MLFileParserQueue () - (void)didFinishOperation:(MLParsingOperation *)op; @end @implementation MLParsingOperation @synthesize file=_file; - (id)initWithFile:(MLFile *)file; { if (!(self = [super init])) return nil; self.file = file; return self; } - (void)parse { NSAssert(!_media, @"We are already parsing"); APLog(@"Starting parsing %@", self.file); [[MLCrashPreventer sharedPreventer] willParseFile:self.file]; _media = [VLCMedia mediaWithURL:[NSURL URLWithString:self.file.url]]; _media.delegate = self; [_media parse]; MLFileParserQueue *parserQueue = [MLFileParserQueue sharedFileParserQueue]; [parserQueue.queue setSuspended:YES]; // Balanced in -mediaDidFinishParsing // Balanced in -mediaDidFinishParsing: } - (void)main { [self performSelectorOnMainThread:@selector(parse) withObject:nil waitUntilDone:YES]; } - (void)mediaDidFinishParsing:(VLCMedia *)media { APLog(@"Parsed %@ - %lu tracks", media, [[_media tracksInformation] count]); if (_media.delegate != self) return; _media.delegate = nil; NSArray *tracks = [_media tracksInformation]; NSMutableSet *tracksSet = [NSMutableSet setWithCapacity:[tracks count]]; for (NSDictionary *track in tracks) { NSString *type = track[VLCMediaTracksInformationType]; NSManagedObject *trackInfo = nil; if ([type isEqualToString:VLCMediaTracksInformationTypeVideo]) { trackInfo = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"VideoTrackInformation"]; [trackInfo setValue:track[VLCMediaTracksInformationVideoWidth] forKey:@"width"]; [trackInfo setValue:track[VLCMediaTracksInformationVideoHeight] forKey:@"height"]; } else if ([type isEqualToString:VLCMediaTracksInformationTypeAudio]) { trackInfo = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"AudioTrackInformation"]; [trackInfo setValue:track[VLCMediaTracksInformationAudioRate] forKey:@"sampleRate"]; [trackInfo setValue:track[VLCMediaTracksInformationAudioChannelsNumber] forKey:@"channelsNumber"]; } else if ([type isEqualToString:VLCMediaTracksInformationTypeText]) { trackInfo = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"SubtitlesTrackInformation"]; [trackInfo setValue:track[VLCMediaTracksInformationTextEncoding] forKey:@"textEncoding"]; } if (trackInfo) { [trackInfo setValue:track[VLCMediaTracksInformationBitrate] forKey:@"bitrate"]; [trackInfo setValue:[track[VLCMediaTracksInformationCodec] stringValue] forKey:@"codec"]; [trackInfo setValue:track[VLCMediaTracksInformationCodec] forKey:@"codecFourCC"]; [trackInfo setValue:track[VLCMediaTracksInformationCodecLevel] forKey:@"codecLevel"]; [trackInfo setValue:track[VLCMediaTracksInformationCodecProfile] forKey:@"codecProfile"]; [trackInfo setValue:track[VLCMediaTracksInformationLanguage] forKey:@"language"]; [tracksSet addObject:trackInfo]; } } [self.file setTracks:tracksSet]; [self.file setDuration:[[_media length] numberValue]]; if ([self.file isAlbumTrack]) { NSDictionary *audioContentInfo = [_media metaDictionary]; if (audioContentInfo && audioContentInfo.count > 0) { NSString *title = audioContentInfo[VLCMetaInformationTitle]; NSString *artist = audioContentInfo[VLCMetaInformationArtist]; NSString *albumName = audioContentInfo[VLCMetaInformationAlbum]; NSString *releaseYear = audioContentInfo[VLCMetaInformationDate]; NSString *genre = audioContentInfo[VLCMetaInformationGenre]; NSString *trackNumber = audioContentInfo[VLCMetaInformationTrackNumber]; MLAlbum *album = nil; BOOL wasCreated = NO; MLAlbumTrack *track = [MLAlbumTrack trackWithAlbumName:albumName trackNumber:@([trackNumber integerValue]) createIfNeeded:YES wasCreated:&wasCreated]; if (track) { album = track.album; track.title = title ? title : @""; track.artist = artist ? artist : @""; track.genre = genre ? genre : @""; album.releaseYear = releaseYear ? releaseYear : @""; if (!track.title || [track.title isEqualToString:@""]) track.title = [MLTitleDecrapifier decrapify:self.file.title]; [track addFilesObject:self.file]; self.file.albumTrack = track; } } } MLFileParserQueue *parserQueue = [MLFileParserQueue sharedFileParserQueue]; [[MLCrashPreventer sharedPreventer] didParseFile:self.file]; [parserQueue.queue setSuspended:NO]; [parserQueue didFinishOperation:self]; _media = nil; } @end @implementation MLFileParserQueue @synthesize queue=_queue; + (MLFileParserQueue *)sharedFileParserQueue { static MLFileParserQueue *shared = nil; if (!shared) { shared = [[MLFileParserQueue alloc] init]; } return shared; } - (id)init { self = [super init]; if (self != nil) { _fileDescriptionToOperation = [[NSMutableDictionary alloc] init]; _queue = [[NSOperationQueue alloc] init]; [_queue setMaxConcurrentOperationCount:1]; } return self; } static inline NSString *hashFromFile(MLFile *file) { return [NSString stringWithFormat:@"%p", [[file objectID] URIRepresentation]]; } - (void)didFinishOperation:(MLParsingOperation *)op { [_fileDescriptionToOperation setValue:nil forKey:hashFromFile(op.file)]; } - (void)addFile:(MLFile *)file { if (_fileDescriptionToOperation[hashFromFile(file)]) return; if (![[MLCrashPreventer sharedPreventer] isFileSafe:file]) { APLog(@"%@ is unsafe and will crash, ignoring", file); return; } MLParsingOperation *op = [[MLParsingOperation alloc] initWithFile:file]; [_fileDescriptionToOperation setValue:op forKey:hashFromFile(file)]; [self.queue addOperation:op]; } - (void)stop { [_queue setMaxConcurrentOperationCount:0]; } - (void)resume { [_queue setMaxConcurrentOperationCount:1]; } - (void)setHighPriorityForFile:(MLFile *)file { MLParsingOperation *op = _fileDescriptionToOperation[hashFromFile(file)]; [op setQueuePriority:NSOperationQueuePriorityHigh]; } - (void)setDefaultPriorityForFile:(MLFile *)file { MLParsingOperation *op = _fileDescriptionToOperation[hashFromFile(file)]; [op setQueuePriority:NSOperationQueuePriorityNormal]; } @end Sources/MLLabel.m000066400000000000000000000044431250533726500141440ustar00rootroot00000000000000/***************************************************************************** * MLLabel.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLLabel.h" #import "MLMediaLibrary.h" #import "MLFile.h" @implementation MLLabel + (NSArray *)allLabels { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Label" inManagedObjectContext:moc]; [request setEntity:entity]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; [request setSortDescriptors:@[descriptor]]; NSArray *labels = [moc executeFetchRequest:request error:nil]; return labels; } @dynamic name; @dynamic files; - (NSArray *)sortedFolderItems { NSArray *folderItems = [[self valueForKey:@"files"] allObjects]; NSSortDescriptor *folderItemDescriptor = [[NSSortDescriptor alloc] initWithKey:@"folderTrackNumber" ascending:YES selector:@selector(compare:)]; NSArray *items = [folderItems sortedArrayUsingDescriptors:@[folderItemDescriptor]]; return items; } @end Sources/MLMediaLibrary.m000066400000000000000000001072251250533726500154730ustar00rootroot00000000000000/***************************************************************************** * MLMediaLibrary.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLMediaLibrary.h" #import "MLTitleDecrapifier.h" #import "MLMovieInfoGrabber.h" #import "MLTVShowInfoGrabber.h" #import "MLTVShowEpisodesInfoGrabber.h" #import "MLFile.h" #import "MLLabel.h" #import "MLShowEpisode.h" #import "MLShow.h" #import "MLThumbnailerQueue.h" #import "MLAlbumTrack.h" #import "MLAlbum.h" #import "MLFileParserQueue.h" #import "MLCrashPreventer.h" @interface MLMediaLibrary () { NSManagedObjectContext *_managedObjectContext; NSManagedObjectModel *_managedObjectModel; BOOL _allowNetworkAccess; NSString *_thumbnailFolderPath; NSString *_databaseFolderPath; NSString *_documentFolderPath; } @end #define DEBUG 1 // To debug #define DELETE_LIBRARY_ON_EACH_LAUNCH 0 // Pref key static NSString *kLastTVDBUpdateServerTime = @"MLLastTVDBUpdateServerTime"; static NSString *kUpdatedToTheGreatSharkHuntDatabaseFormat = @"upgradedToDatabaseFormat 2.3"; static NSString *kDecrapifyTitles = @"MLDecrapifyTitles"; #if HAVE_BLOCK @interface MLMediaLibrary () #else @interface MLMediaLibrary () #endif - (NSManagedObjectContext *)managedObjectContext; - (NSString *)databaseFolderPath; @end @implementation MLMediaLibrary + (void)initialize { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults registerDefaults:@{kUpdatedToTheGreatSharkHuntDatabaseFormat : @NO, kDecrapifyTitles : @YES}]; } + (id)sharedMediaLibrary { static id sharedMediaLibrary = nil; if (!sharedMediaLibrary) { sharedMediaLibrary = [[[self class] alloc] init]; APLog(@"Initializing db in %@", [sharedMediaLibrary databaseFolderPath]); // Also force to init the crash preventer // Because it will correctly set up the parser and thumbnail queue [MLCrashPreventer sharedPreventer]; } return sharedMediaLibrary; } - (void)dealloc { if (_managedObjectContext) [_managedObjectContext removeObserver:self forKeyPath:@"hasChanges"]; } - (NSFetchRequest *)fetchRequestForEntity:(NSString *)entity { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [self managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:entity inManagedObjectContext:moc]; NSAssert(entityDescription, @"No entity"); [request setEntity:entityDescription]; return request; } - (id)createObjectForEntity:(NSString *)entity { NSManagedObjectContext *moc = [self managedObjectContext]; return [NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:moc]; } - (void)removeObject:(NSManagedObject *)object { [[self managedObjectContext] deleteObject:object]; } #pragma mark - #pragma mark Media Library - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel) return _managedObjectModel; NSString *path = [[NSBundle mainBundle] pathForResource:@"MediaLibrary" ofType:@"momd"]; NSURL *momURL = [NSURL fileURLWithPath:path]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; return _managedObjectModel; } - (NSString *)databaseFolderPath { if (_databaseFolderPath) { if (_databaseFolderPath.length > 0) return _databaseFolderPath; } int directory = NSLibraryDirectory; NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES); NSString *directoryPath = paths[0]; #if DELETE_LIBRARY_ON_EACH_LAUNCH [[NSFileManager defaultManager] removeItemAtPath:directoryPath error:nil]; #endif _databaseFolderPath = directoryPath; return _databaseFolderPath; } - (NSString *)thumbnailFolderPath { if (_thumbnailFolderPath) { if (_thumbnailFolderPath.length > 0) return _thumbnailFolderPath; } int directory = NSLibraryDirectory; NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES); NSString *directoryPath = paths[0]; #if DELETE_LIBRARY_ON_EACH_LAUNCH [[NSFileManager defaultManager] removeItemAtPath:directoryPath error:nil]; #endif _thumbnailFolderPath = [directoryPath stringByAppendingPathComponent:@"Thumbnails"]; return _thumbnailFolderPath; } - (NSString *)documentFolderPath { if (_documentFolderPath) { if (_documentFolderPath.length > 0) return _documentFolderPath; } int directory = NSDocumentDirectory; NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES); _documentFolderPath = [NSString stringWithFormat:@"file://%@", paths[0]]; return _documentFolderPath; } - (NSURL *)persistentStoreURL { NSString *databaseFolderPath = [self databaseFolderPath]; NSString *path = [databaseFolderPath stringByAppendingPathComponent: @"MediaLibrary.sqlite"]; return [NSURL fileURLWithPath:path]; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSNumber *yes = @YES; NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : yes, NSInferMappingModelAutomaticallyOption : yes}; NSError *error; NSPersistentStore *persistentStore = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.persistentStoreURL options:options error:&error]; if (!persistentStore) { #if! TARGET_OS_IPHONE // FIXME: Deal with versioning NSInteger ret = NSRunAlertPanel(@"Error", @"The Media Library you have on your disk is not compatible with the one Lunettes can read. Do you want to create a new one?", @"No", @"Yes", nil); if (ret == NSOKButton) [NSApp terminate:nil]; [[NSFileManager defaultManager] removeItemAtPath:self.persistentStoreURL.path error:nil]; #else [[NSFileManager defaultManager] removeItemAtPath:self.persistentStoreURL.path error:nil]; #endif persistentStore = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.persistentStoreURL options:options error:&error]; if (!persistentStore) { #if! TARGET_OS_IPHONE NSRunInformationalAlertPanel(@"Corrupted Media Library", @"There is nothing we can apparently do about it...", @"OK", nil, nil); #else UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Corrupted Media Library" message:@"There is nothing we can apparently do about it..." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; #endif // Probably assert instead. return nil; } } return coordinator; } - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext) return _managedObjectContext; _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; [_managedObjectContext setUndoManager:nil]; [_managedObjectContext addObserver:self forKeyPath:@"hasChanges" options:NSKeyValueObservingOptionInitial context:nil]; return _managedObjectContext; } - (void)savePendingChanges { [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(savePendingChanges) object:nil]; NSError *error = nil; BOOL success = [[self managedObjectContext] save:&error]; NSAssert1(success, @"Can't save: %@", error); #if !TARGET_OS_IPHONE && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 NSProcessInfo *process = [NSProcessInfo processInfo]; if ([process respondsToSelector:@selector(enableSuddenTermination)]) [process enableSuddenTermination]; #endif } - (void)save { NSError *error = nil; BOOL success = [[self managedObjectContext] save:&error]; NSAssert1(success, @"Can't save: %@", error); } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"hasChanges"] && object == _managedObjectContext) { #if !TARGET_OS_IPHONE && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 NSProcessInfo *process = [NSProcessInfo processInfo]; if ([process respondsToSelector:@selector(disableSuddenTermination)]) [process disableSuddenTermination]; #endif if ([[self managedObjectContext] hasChanges]) { [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(savePendingChanges) object:nil]; [self performSelector:@selector(savePendingChanges) withObject:nil afterDelay:1.]; } return; } [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } #pragma mark - #pragma mark No meta data fallbacks - (void)computeThumbnailForFile:(MLFile *)file { if (!file.computedThumbnail) { APLog(@"Computing thumbnail for %@", file.title); [[MLThumbnailerQueue sharedThumbnailerQueue] addFile:file]; } } - (void)errorWhenFetchingMetaDataForFile:(MLFile *)file { APLog(@"Error when fetching for '%@'", file.title); [self computeThumbnailForFile:file]; } - (void)errorWhenFetchingMetaDataForShow:(MLShow *)show { for (MLShowEpisode *episode in show.episodes) { for (MLFile *file in episode.files) [self errorWhenFetchingMetaDataForFile:file]; } } - (void)noMetaDataInRemoteDBForFile:(MLFile *)file { file.noOnlineMetaData = @YES; [self computeThumbnailForFile:file]; } - (void)noMetaDataInRemoteDBForShow:(MLShow *)show { for (MLShowEpisode *episode in show.episodes) { for (MLFile *file in episode.files) [self noMetaDataInRemoteDBForFile:file]; } } #pragma mark - #pragma mark Getter - (void)addNewLabelWithName:(NSString *)name { MLLabel *label = [self createObjectForEntity:@"Label"]; label.name = name; } /** * TV MLShow Episodes */ #pragma mark - #pragma mark Online meta data grabbing #if !HAVE_BLOCK - (void)tvShowEpisodesInfoGrabberDidFinishGrabbing:(MLTVShowEpisodesInfoGrabber *)grabber { MLShow *show = grabber.userData; NSArray *results = grabber.episodesResults; [show setValue:(grabber.results)[@"serieArtworkURL"] forKey:@"artworkURL"]; for (id result in results) { if ([result[@"serie"] boolValue]) { continue; } MLShowEpisode *showEpisode = [MLShowEpisode episodeWithShow:show episodeNumber:result[@"episodeNumber"] seasonNumber:result[@"seasonNumber"] createIfNeeded:YES]; showEpisode.name = result[@"title"]; showEpisode.theTVDBID = result[@"id"]; showEpisode.shortSummary = result[@"shortSummary"]; showEpisode.artworkURL = result[@"artworkURL"]; if (!showEpisode.artworkURL) { for (MLFile *file in showEpisode.files) [self computeThumbnailForFile:file]; } showEpisode.lastSyncDate = [MLTVShowInfoGrabber serverTime]; } show.lastSyncDate = [MLTVShowInfoGrabber serverTime]; } - (void)tvShowEpisodesInfoGrabber:(MLTVShowEpisodesInfoGrabber *)grabber didFailWithError:(NSError *)error { MLShow *show = grabber.userData; [self errorWhenFetchingMetaDataForShow:show]; } - (void)tvShowInfoGrabberDidFinishGrabbing:(MLTVShowInfoGrabber *)grabber { MLShow *show = grabber.userData; NSArray *results = grabber.results; if ([results count] > 0) { NSDictionary *result = results[0]; NSString *showId = result[@"id"]; show.theTVDBID = showId; show.name = result[@"title"]; show.shortSummary = result[@"shortSummary"]; show.releaseYear = result[@"releaseYear"]; // Fetch episodes info MLTVShowEpisodesInfoGrabber *grabber = [[MLTVShowEpisodesInfoGrabber alloc] init]; grabber.delegate = self; grabber.userData = show; [grabber lookUpForShowID:showId]; } else { // Not found. [self noMetaDataInRemoteDBForShow:show]; show.lastSyncDate = [MLTVShowInfoGrabber serverTime]; } } - (void)tvShowInfoGrabber:(MLTVShowInfoGrabber *)grabber didFailWithError:(NSError *)error { MLShow *show = grabber.userData; [self errorWhenFetchingMetaDataForShow:show]; } - (void)tvShowInfoGrabberDidFetchServerTime:(MLTVShowInfoGrabber *)grabber { MLShow *show = grabber.userData; [[NSUserDefaults standardUserDefaults] setInteger:[[MLTVShowInfoGrabber serverTime] integerValue] forKey:kLastTVDBUpdateServerTime]; // First fetch the MLShow ID MLTVShowInfoGrabber *showInfoGrabber = [[MLTVShowInfoGrabber alloc] init]; showInfoGrabber.delegate = self; showInfoGrabber.userData = show; APLog(@"Fetching show information on %@", show.name); [showInfoGrabber lookUpForTitle:show.name]; } #endif - (void)fetchMetaDataForShow:(MLShow *)show { if (!_allowNetworkAccess) return; APLog(@"Fetching show server time"); // First fetch the serverTime, so that we can update each entry. #if HAVE_BLOCK [MLTVShowInfoGrabber fetchServerTimeAndExecuteBlock:^(NSNumber *serverDate) { [[NSUserDefaults standardUserDefaults] setInteger:[serverDate integerValue] forKey:kLastTVDBUpdateServerTime]; APLog(@"Fetching show information on %@", show.name); // First fetch the MLShow ID MLTVShowInfoGrabber *grabber = [[[MLTVShowInfoGrabber alloc] init] autorelease]; [grabber lookUpForTitle:show.name andExecuteBlock:^{ NSArray *results = grabber.results; if ([results count] > 0) { NSDictionary *result = [results objectAtIndex:0]; NSString *showId = [result objectForKey:@"id"]; show.theTVDBID = showId; show.name = [result objectForKey:@"title"]; show.shortSummary = [result objectForKey:@"shortSummary"]; show.releaseYear = [result objectForKey:@"releaseYear"]; APLog(@"Fetching show episode information on %@", showId); // Fetch episode info MLTVShowEpisodesInfoGrabber *grabber = [[[MLTVShowEpisodesInfoGrabber alloc] init] autorelease]; [grabber lookUpForShowID:showId andExecuteBlock:^{ NSArray *results = grabber.episodesResults; [show setValue:[grabber.results objectForKey:@"serieArtworkURL"] forKey:@"artworkURL"]; for (id result in results) { if ([[result objectForKey:@"serie"] boolValue]) { continue; } MLShowEpisode *showEpisode = [MLShowEpisode episodeWithShow:show episodeNumber:[result objectForKey:@"episodeNumber"] seasonNumber:[result objectForKey:@"seasonNumber"] createIfNeeded:YES]; showEpisode.name = [result objectForKey:@"title"]; showEpisode.theTVDBID = [result objectForKey:@"id"]; showEpisode.shortSummary = [result objectForKey:@"shortSummary"]; showEpisode.artworkURL = [result objectForKey:@"artworkURL"]; showEpisode.lastSyncDate = serverDate; } show.lastSyncDate = serverDate; }]; } else { // Not found. show.lastSyncDate = serverDate; } }]; }]; #else MLTVShowInfoGrabber *grabber = [[MLTVShowInfoGrabber alloc] init]; grabber.delegate = self; grabber.userData = show; [grabber fetchServerTime]; #endif } - (void)addTVShowEpisodeWithInfo:(NSDictionary *)tvShowEpisodeInfo andFile:(MLFile *)file { file.type = kMLFileTypeTVShowEpisode; NSNumber *seasonNumber = tvShowEpisodeInfo[@"season"]; NSNumber *episodeNumber = tvShowEpisodeInfo[@"episode"]; NSString *tvShowName = tvShowEpisodeInfo[@"tvShowName"]; NSString *tvEpisodeName = tvShowEpisodeInfo[@"tvEpisodeName"]; BOOL hasNoTvShow = NO; if (!tvShowName) { tvShowName = @""; hasNoTvShow = YES; } BOOL wasInserted = NO; MLShow *show = nil; MLShowEpisode *episode = [MLShowEpisode episodeWithShowName:tvShowName episodeNumber:episodeNumber seasonNumber:seasonNumber createIfNeeded:YES wasCreated:&wasInserted]; if (episode) { show = episode.show; [show addEpisode:episode]; } if (wasInserted && !hasNoTvShow) { show.name = tvShowName; [self fetchMetaDataForShow:show]; } episode.name = tvEpisodeName; if (episode.name.length < 1) episode.name = file.title; file.seasonNumber = seasonNumber; file.episodeNumber = episodeNumber; episode.shouldBeDisplayed = @YES; [episode addFilesObject:file]; file.showEpisode = episode; // The rest of the meta data will be fetched using the MLShow file.hasFetchedInfo = @YES; } - (void)addAudioContentWithInfo:(NSDictionary *)audioContentInfo andFile:(MLFile *)file { file.type = kMLFileTypeAudio; file.title = audioContentInfo[VLCMetaInformationTitle]; /* all further meta data is set by the FileParserQueue */ file.hasFetchedInfo = @YES; } /** * MLFile auto detection */ #if !HAVE_BLOCK - (void)movieInfoGrabber:(MLMovieInfoGrabber *)grabber didFailWithError:(NSError *)error { MLFile *file = grabber.userData; [self errorWhenFetchingMetaDataForFile:file]; } - (void)movieInfoGrabberDidFinishGrabbing:(MLMovieInfoGrabber *)grabber { NSNumber *yes = @YES; NSArray *results = grabber.results; MLFile *file = grabber.userData; if ([results count] > 0) { NSDictionary *result = results[0]; file.artworkURL = result[@"artworkURL"]; file.title = result[@"title"]; file.shortSummary = result[@"shortSummary"]; file.releaseYear = result[@"releaseYear"]; } else { [self noMetaDataInRemoteDBForFile:file]; } file.hasFetchedInfo = yes; } #endif - (void)fetchMetaDataForFile:(MLFile *)file { APLog(@"Fetching meta data for %@", file.title); [[MLFileParserQueue sharedFileParserQueue] addFile:file]; if (!_allowNetworkAccess) { // Automatically compute the thumbnail [self computeThumbnailForFile:file]; } NSDictionary *tvShowEpisodeInfo = [MLTitleDecrapifier tvShowEpisodeInfoFromString:file.title]; if (tvShowEpisodeInfo) { [self addTVShowEpisodeWithInfo:tvShowEpisodeInfo andFile:file]; return; } if ([file isSupportedAudioFile]) { NSDictionary *audioContentInfo = [MLTitleDecrapifier audioContentInfoFromFile:file]; if (audioContentInfo && ![file videoTrack]) { [self addAudioContentWithInfo:audioContentInfo andFile:file]; return; } } if (!_allowNetworkAccess) return; // Go online and fetch info. // We don't care about keeping a reference to track the item during its life span // because we are a singleton MLMovieInfoGrabber *grabber = [[MLMovieInfoGrabber alloc] init]; APLog(@"Looking up for Movie '%@'", file.title); #if HAVE_BLOCK [grabber lookUpForTitle:file.title andExecuteBlock:^(NSError *err){ if (err) { [self errorWhenFetchingMetaDataForFile:file]; return; } NSArray *results = grabber.results; if ([results count] > 0) { NSDictionary *result = [results objectAtIndex:0]; file.artworkURL = [result objectForKey:@"artworkURL"]; if (!file.artworkURL) [self computeThumbnailForFile:file]; file.title = [result objectForKey:@"title"]; file.shortSummary = [result objectForKey:@"shortSummary"]; file.releaseYear = [result objectForKey:@"releaseYear"]; } else [self noMetaDataInRemoteDBForFile:file]; file.hasFetchedInfo = [NSNumber numberWithBool:YES]; }]; #else grabber.userData = file; grabber.delegate = self; [grabber lookUpForTitle:file.title]; #endif } #pragma mark - #pragma mark Adding file to the DB - (void)addFilePath:(NSString *)filePath { APLog(@"Adding Path %@", filePath); NSURL *url = [NSURL fileURLWithPath:filePath]; NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; NSString *title = [filePath lastPathComponent]; #if !TARGET_OS_IPHONE NSDate *openedDate = nil; // FIXME kMDItemLastUsedDate NSDate *modifiedDate = nil; // FIXME [result valueForAttribute:@"kMDItemFSContentChangeDate"]; #endif NSNumber *size = attributes[NSFileSize]; // FIXME [result valueForAttribute:@"kMDItemFSSize"]; MLFile *file = [self createObjectForEntity:@"File"]; file.url = [url absoluteString]; // Yes, this is a negative number. VLCTime nicely display negative time // with "XX minutes remaining". And we are using this facility. NSNumber *no = @NO; NSNumber *yes = @YES; file.currentlyWatching = no; file.lastPosition = @0.0; file.remainingTime = @0.0; file.unread = yes; #if !TARGET_OS_IPHONE if ([openedDate isGreaterThan:modifiedDate]) { file.playCount = [NSNumber numberWithDouble:1]; file.unread = no; } #endif if ([[[NSUserDefaults standardUserDefaults] objectForKey:kDecrapifyTitles] boolValue] == YES) file.title = [MLTitleDecrapifier decrapify:[title stringByDeletingPathExtension]]; else file.title = [title stringByDeletingPathExtension]; if ([size longLongValue] < 150000000) /* 150 MB */ file.type = kMLFileTypeClip; else file.type = kMLFileTypeMovie; [self fetchMetaDataForFile:file]; } - (void)addFilePaths:(NSArray *)filepaths { NSUInteger count = [filepaths count]; NSMutableArray *fetchPredicates = [NSMutableArray arrayWithCapacity:count]; NSMutableDictionary *urlToObject = [NSMutableDictionary dictionaryWithCapacity:count]; NSString *documentFolderPath = [[MLMediaLibrary sharedMediaLibrary] documentFolderPath]; // Prepare a fetch request for all items NSArray *pathComponents; NSUInteger componentCount; for (NSString *path in filepaths) { #if TARGET_OS_IPHONE NSString *urlString; NSString *componentString = @""; pathComponents = [path componentsSeparatedByString:@"/"]; componentCount = pathComponents.count; if ([pathComponents[componentCount - 2] isEqualToString:@"Documents"]) componentString = [path lastPathComponent]; else { NSUInteger firstElement = [pathComponents indexOfObject:@"Documents"] + 1; for (NSUInteger x = 0; x < componentCount - firstElement; x++) { if (x == 0) componentString = [componentString stringByAppendingFormat:@"%@", pathComponents[firstElement + x]]; else componentString = [componentString stringByAppendingFormat:@"/%@", pathComponents[firstElement + x]]; } } /* compose and escape string */ urlString = [[NSString stringWithFormat:@"%@/%@", documentFolderPath, componentString] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; /* check for the end of the paths */ [fetchPredicates addObject:[NSPredicate predicateWithFormat:@"url CONTAINS %@", [urlString lastPathComponent]]]; [urlToObject setObject:path forKey:urlString]; #else [fetchPredicates addObject:[NSPredicate predicateWithFormat:@"url == %@", path]]; #endif } NSFetchRequest *request = [self fetchRequestForEntity:@"File"]; [request setPredicate:[NSCompoundPredicate orPredicateWithSubpredicates:fetchPredicates]]; APLog(@"Fetching"); NSArray *dbResults = [[self managedObjectContext] executeFetchRequest:request error:nil]; APLog(@"Done"); NSMutableArray *filePathsToAdd = [NSMutableArray arrayWithArray:filepaths]; // Remove objects that are already in db. for (MLFile *dbResult in dbResults) { NSString *urlString = dbResult.url; [filePathsToAdd removeObject:[urlToObject objectForKey:urlString]]; } // Add only the newly added items for (NSString* path in filePathsToAdd) [self addFilePath:path]; } #pragma mark - #pragma mark DB Updates #if !HAVE_BLOCK - (void)tvShowInfoGrabber:(MLTVShowInfoGrabber *)grabber didFetchUpdates:(NSArray *)updates { NSFetchRequest *request = [self fetchRequestForEntity:@"Show"]; [request setPredicate:[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"theTVDBID"] rightExpression:[NSExpression expressionForConstantValue:updates] modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]]; NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLShow *show in results) [self fetchMetaDataForShow:show]; } #endif - (BOOL)libraryNeedsUpgrade { if (![[[NSUserDefaults standardUserDefaults] objectForKey:kUpdatedToTheGreatSharkHuntDatabaseFormat] boolValue]) return YES; return NO; } - (void)upgradeLibrary { if (![[[NSUserDefaults standardUserDefaults] objectForKey:kUpdatedToTheGreatSharkHuntDatabaseFormat] boolValue]) [self _upgradeLibraryToGreatSharkHuntDatabaseFormat]; } - (void)_upgradeLibraryToGreatSharkHuntDatabaseFormat { [self libraryDidDisappear]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSFileManager *fileManager = [NSFileManager defaultManager]; /* remove potential empty albums left over by previous releases */ NSArray *collection = [MLAlbum allAlbums]; NSUInteger count = collection.count; MLAlbum *album; MLAlbumTrack *track; NSArray *secondaryCollection; NSURL *fileURL; NSUInteger secondaryCount = 0; NSArray *tertiaryCollection; NSUInteger tertiaryCount = 0; NSUInteger emptyAlbumCounter = 0; for (NSUInteger x = 0; x < count; x++) { album = collection[x]; if (album.tracks.count < 1) [[self managedObjectContext] deleteObject:album]; else { secondaryCollection = album.tracks.allObjects; secondaryCount = secondaryCollection.count; emptyAlbumCounter = 0; for (NSUInteger y = 0; y < secondaryCount; y++) { track = secondaryCollection[y]; tertiaryCollection = track.files.allObjects; tertiaryCount = tertiaryCollection.count; for (NSUInteger z = 0; z < tertiaryCount; z++) { fileURL = [NSURL URLWithString:[(MLFile *)tertiaryCollection[z] url]]; BOOL exists = [fileManager fileExistsAtPath:[fileURL path]]; if (exists) emptyAlbumCounter++; else [album removeTrack:track]; } } if (emptyAlbumCounter == 0) [[self managedObjectContext] deleteObject:album]; } } album = nil; /* remove potential empty shows left over by previous releases */ collection = [MLShow allShows]; MLShow *show; MLShowEpisode *showEpisode; count = collection.count; for (NSUInteger x = 0; x < count; x++) { show = collection[x]; if (show.episodes.count < 1) [[self managedObjectContext] deleteObject:show]; else { secondaryCollection = show.episodes.allObjects; secondaryCount = secondaryCollection.count; emptyAlbumCounter = 0; for (NSUInteger y = 0; y < secondaryCount; y++) { showEpisode = secondaryCollection[y]; tertiaryCollection = showEpisode.files.allObjects; tertiaryCount = tertiaryCollection.count; for (NSUInteger z = 0; z < tertiaryCount; z++) { fileURL = [NSURL URLWithString:[(MLFile *)tertiaryCollection[z] url]]; BOOL exists = [fileManager fileExistsAtPath:[fileURL path]]; if (exists) emptyAlbumCounter++; else [show removeEpisode:showEpisode]; } } if (emptyAlbumCounter == 0) [[self managedObjectContext] deleteObject:show]; } } /* remove duplicates */ NSArray *allFiles = [MLFile allFiles]; NSUInteger allFilesCount = allFiles.count; NSMutableArray *seenFiles = [[NSMutableArray alloc] initWithCapacity:allFilesCount]; MLFile *currentFile; NSString *currentFilePath; for (NSUInteger x = 0; x < allFilesCount; x++) { currentFile = allFiles[x]; currentFilePath = [currentFile.url stringByReplacingOccurrencesOfString:@"/localhost/" withString:@"//"]; if ([seenFiles containsObject:currentFilePath]) [[self managedObjectContext] deleteObject:currentFile]; else [seenFiles addObject:currentFilePath]; } [defaults setBool:YES forKey:kUpdatedToTheGreatSharkHuntDatabaseFormat]; [defaults synchronize]; [self libraryDidAppear]; if ([self.delegate respondsToSelector:@selector(libraryUpgradeComplete)]) [self.delegate libraryUpgradeComplete]; } - (void)updateMediaDatabase { [self libraryDidDisappear]; // Remove no more present files NSFetchRequest *request = [self fetchRequestForEntity:@"File"]; NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:nil]; NSFileManager *fileManager = [NSFileManager defaultManager]; unsigned int count = (unsigned int)results.count; for (unsigned int x = 0; x < count; x++) { MLFile *file = results[x]; NSString *urlString = [file url]; NSURL *fileURL = [NSURL URLWithString:urlString]; BOOL exists = [fileManager fileExistsAtPath:[fileURL path]]; if (!exists) { APLog(@"Marking - %@", [fileURL absoluteString]); file.isSafe = YES; // It doesn't exist, it's safe. if (file.isAlbumTrack) { MLAlbum *album = file.albumTrack.album; if (album.tracks.count <= 1) { @try { [[self managedObjectContext] deleteObject:album]; } @catch (NSException *exception) { APLog(@"failed to nuke object because it disappeared in front of us"); } } else [album removeTrack:file.albumTrack]; } if (file.isShowEpisode) { MLShow *show = file.showEpisode.show; if (show.episodes.count <= 1) { @try { [[self managedObjectContext] deleteObject:show]; } @catch (NSException *exception) { APLog(@"failed to nuke object because it disappeared in front of us"); } } else [show removeEpisode:file.showEpisode]; } #if TARGET_OS_IPHONE NSString *thumbPath = [file thumbnailPath]; bool thumbExists = [fileManager fileExistsAtPath:thumbPath]; if (thumbExists) [fileManager removeItemAtPath:thumbPath error:nil]; [[self managedObjectContext] deleteObject:file]; #endif } #if !TARGET_OS_IPHONE file.isOnDisk = @(exists); #endif } [self libraryDidAppear]; // Get the file to parse request = [self fetchRequestForEntity:@"File"]; [request setPredicate:[NSPredicate predicateWithFormat:@"isOnDisk == YES && tracks.@count == 0"]]; results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLFile *file in results) [[MLFileParserQueue sharedFileParserQueue] addFile:file]; if (!_allowNetworkAccess) { // Always attempt to fetch request = [self fetchRequestForEntity:@"File"]; [request setPredicate:[NSPredicate predicateWithFormat:@"isOnDisk == YES"]]; results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLFile *file in results) { if (!file.computedThumbnail) [self computeThumbnailForFile:file]; } return; } // Get the thumbnails to compute request = [self fetchRequestForEntity:@"File"]; [request setPredicate:[NSPredicate predicateWithFormat:@"isOnDisk == YES && hasFetchedInfo == 1 && artworkURL == nil"]]; results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLFile *file in results) if (!file.computedThumbnail && ![file isAlbumTrack]) [self computeThumbnailForFile:file]; // Get to fetch meta data request = [self fetchRequestForEntity:@"File"]; [request setPredicate:[NSPredicate predicateWithFormat:@"isOnDisk == YES && hasFetchedInfo == 0"]]; results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLFile *file in results) [self fetchMetaDataForFile:file]; // Get to fetch show info request = [self fetchRequestForEntity:@"Show"]; [request setPredicate:[NSPredicate predicateWithFormat:@"lastSyncDate == 0"]]; results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLShow *show in results) [self fetchMetaDataForShow:show]; // Get updated TV Shows NSNumber *lastServerTime = @([[NSUserDefaults standardUserDefaults] integerForKey:kLastTVDBUpdateServerTime]); #if HAVE_BLOCK [MLTVShowInfoGrabber fetchUpdatesSinceServerTime:lastServerTime andExecuteBlock:^(NSArray *updates){ NSFetchRequest *request = [self fetchRequestForEntity:@"Show"]; [request setPredicate:[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"theTVDBID"] rightExpression:[NSExpression expressionForConstantValue:updates] modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]]; NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (MLShow *show in results) [self fetchMetaDataForShow:show]; }]; #else MLTVShowInfoGrabber *grabber = [[MLTVShowInfoGrabber alloc] init]; grabber.delegate = self; [grabber fetchUpdatesSinceServerTime:lastServerTime]; #endif /* Update every hour - FIXME: Preferences key */ [self performSelector:@selector(updateMediaDatabase) withObject:nil afterDelay:60 * 60]; } - (void)applicationWillExit { [[MLCrashPreventer sharedPreventer] cancelAllFileParse]; } - (void)applicationWillStart { [[MLCrashPreventer sharedPreventer] markCrasherFiles]; } - (void)libraryDidDisappear { // Stop expansive work [[MLThumbnailerQueue sharedThumbnailerQueue] stop]; } - (void)libraryDidAppear { // Resume our work [[MLThumbnailerQueue sharedThumbnailerQueue] resume]; } @end Sources/MLMovieInfoGrabber.m000066400000000000000000000131051250533726500163000ustar00rootroot00000000000000/***************************************************************************** * MLMovieInfoGrabber.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLMovieInfoGrabber.h" #define TMDB_HOSTNAME "api.themoviedb.org" #define TMDB_API_KEY "5401cd030990fba60e1c23d2832de62e" #define TMDB_QUERY_SEARCH @"http://%s/2.0/Movie.search?title=%@&api_key=%s" #define TMDB_QUERY_INFO @"http://%s/2.0/Movie.getInfo?id=%@&api_key=%s" @interface MLMovieInfoGrabber () @property (readwrite, strong) NSArray *results; @end @implementation MLMovieInfoGrabber @synthesize delegate=_delegate; @synthesize results=_results; #if !HAVE_BLOCK @synthesize userData=_userData; #endif - (void)lookUpForTitle:(NSString *)title { NSString *escapedString = [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TMDB_QUERY_SEARCH, TMDB_HOSTNAME, escapedString, TMDB_API_KEY]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:4]; [_connection cancel]; _data = [[NSMutableData alloc] init]; // Keep a reference to ourself while we are alive. _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; NSAssert(_connection, @"Can't create connection"); } #if HAVE_BLOCK - (void)lookUpForTitle:(NSString *)title andExecuteBlock:(void (^)(NSError *))block { Block_release(_block); _block = Block_copy(block); [self lookUpForTitle:title]; } #endif - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { APLog(@"Did Fail %@", _delegate); if ([_delegate respondsToSelector:@selector(movieInfoGrabber:didFailWithError:)]) { APLog(@"Did Fail Calling %@", _delegate); [_delegate movieInfoGrabber:self didFailWithError:error]; } #if HAVE_BLOCK if (_block) { _block(error); // Release the eventual block. This prevents ref cycle. Block_release(_block); _block = NULL; } #endif } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_data appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:_data options:0 error:nil]; _data = nil; NSError *error = nil; NSArray *nodes = [xmlDoc nodesForXPath:@"./results/moviematches/movie" error:&error]; if ([nodes count] > 0 ) { NSMutableArray *array = [NSMutableArray arrayWithCapacity:[nodes count]]; for (NSXMLNode *node in nodes) { NSString *id = [node stringValueForXPath:@"./id"]; if (!id) continue; NSString *title = [node stringValueForXPath:@"./title"]; NSString *release = [node stringValueForXPath:@"./release"]; NSString *releaseYear = nil; if (release) { NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init]; [inputFormatter setDateFormat:@"yyyy-MM-dd"]; NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; [outputFormatter setDateFormat:@"yyyy"]; NSDate *releaseDate = [inputFormatter dateFromString:release]; releaseYear = releaseDate ? [outputFormatter stringFromDate:releaseDate] : nil; } //APLog(@"%@", title); //APLog(TMDB_QUERY_INFO, TMDB_HOSTNAME, id, TMDB_API_KEY); NSString *artworkURL = [node stringValueForXPath:@"./poster[size='cover']"]; if (!artworkURL) artworkURL = [node stringValueForXPath:@"./poster"]; if (!artworkURL) artworkURL = [node stringValueForXPath:@"./backdrop[@size='cover']"]; if (!artworkURL) artworkURL = [node stringValueForXPath:@"./backdrop"]; NSString *shortSummary = [node stringValueForXPath:@"./short_overview"]; [array addObject:@{@"title": title, @"shortSummary": shortSummary ?: @"", @"releaseYear": releaseYear ?: @"", @"artworkURL": artworkURL}]; } self.results = array; } else { self.results = nil; } #if HAVE_BLOCK if (_block) { _block(nil); Block_release(_block); _block = NULL; } #endif if ([_delegate respondsToSelector:@selector(movieInfoGrabberDidFinishGrabbing:)]) [_delegate movieInfoGrabberDidFinishGrabbing:self]; } @end Sources/MLShow.m000066400000000000000000000117651250533726500140520ustar00rootroot00000000000000/***************************************************************************** * MLShow.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLShow.h" #import "MLShowEpisode.h" #import "MLMediaLibrary.h" @implementation MLShow + (NSArray *)allShows { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Show" inManagedObjectContext:moc]; [request setEntity:entity]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; [request setSortDescriptors:@[descriptor]]; NSArray *shows = [moc executeFetchRequest:request error:nil]; return shows; } + (MLShow *)showWithName:(NSString *)name { NSFetchRequest *request = [[MLMediaLibrary sharedMediaLibrary] fetchRequestForEntity:@"Show"]; [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", name]]; NSArray *dbResults = [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] executeFetchRequest:request error:nil]; NSAssert(dbResults, @"Can't execute fetch request"); if ([dbResults count] <= 0) return nil; return dbResults[0]; } @dynamic theTVDBID; @dynamic shortSummary; @dynamic artworkURL; @dynamic name; @dynamic lastSyncDate; @dynamic releaseYear; @dynamic episodes; - (NSSet *)unreadEpisodes { NSArray *episodes = [[self valueForKey:@"episodes"] allObjects]; NSMutableSet *set = [NSMutableSet set]; NSUInteger count = episodes.count; for (NSUInteger x = 0; x < count; x++) { NSSet *files = [episodes[x] valueForKey:@"files"]; for (id file in files) { if ([[file valueForKey:@"unread"] boolValue]) { [set addObject:episodes[x]]; break; } } } return set; } - (NSArray *)sortedEpisodes { NSArray *episodes = [[self valueForKey:@"episodes"] allObjects]; NSSortDescriptor *seasonDescriptor = [[NSSortDescriptor alloc] initWithKey:@"seasonNumber" ascending:YES selector:@selector(compare:)]; NSSortDescriptor *episodesDescriptor = [[NSSortDescriptor alloc] initWithKey:@"episodeNumber" ascending:YES selector:@selector(compare:)]; NSArray *descriptors = @[seasonDescriptor, episodesDescriptor]; return [episodes sortedArrayUsingDescriptors:descriptors]; } - (void)addEpisode:(MLShowEpisode*)episode { if (!episode) return; NSMutableSet *episodes = [self mutableSetValueForKey:@"episodes"]; [episodes addObject:episode]; [self willChangeValueForKey:@"episodes"]; [self setValue:episodes forKey:@"episodes"]; [self didChangeValueForKey:@"episodes"]; } - (void)removeEpisode:(MLShowEpisode*)episode { if (!episode) return; NSMutableSet *episodes = [self mutableSetValueForKey:@"episodes"]; [episodes removeObject:episode]; [self willChangeValueForKey:@"episodes"]; [self setValue:episodes forKey:@"episodes"]; [self didChangeValueForKey:@"episodes"]; } - (void)removeEpisodeWithSeasonNumber:(NSNumber *)seasonNumber andEpisodeNumber:(NSNumber *)episodeNumber { NSMutableSet *episodes = [self mutableSetValueForKey:@"episodes"]; MLShowEpisode *episode = nil; if (seasonNumber && episodeNumber) { for (MLShowEpisode *episodeIter in episodes) { if ([episodeIter.seasonNumber intValue] == [seasonNumber intValue] && [episodeIter.episodeNumber intValue] == [episodeNumber intValue]) { episode = episodeIter; break; } } } if (!episode) return; [episodes removeObject:episode]; [self willChangeValueForKey:@"episodes"]; [self setValue:episodes forKey:@"episodes"]; [self didChangeValueForKey:@"episodes"]; } @end Sources/MLShowEpisode.m000066400000000000000000000114041250533726500153510ustar00rootroot00000000000000/***************************************************************************** * MLShowEpisode.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLMediaLibrary.h" #import "MLShowEpisode.h" #import "MLShow.h" @interface MLShowEpisode () @property (nonatomic, strong) NSNumber *primitiveUnread; @property (nonatomic, strong) NSString *primitiveArtworkURL; @end @implementation MLShowEpisode + (NSArray *)allEpisodes { NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = [[MLMediaLibrary sharedMediaLibrary] managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"ShowEpisode" inManagedObjectContext:moc]; [request setEntity:entity]; NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; [request setSortDescriptors:@[descriptor]]; [request setPredicate:[NSPredicate predicateWithFormat:@"files.@count > 0"]]; NSArray *episodes = [moc executeFetchRequest:request error:nil]; return episodes; } + (MLShowEpisode *)episodeWithShow:(MLShow *)show episodeNumber:(NSNumber *)episodeNumber seasonNumber:(NSNumber *)seasonNumber createIfNeeded:(BOOL)createIfNeeded { if (!show) return NULL; NSSet *episodes = [show valueForKey:@"episodes"]; MLShowEpisode *episode = nil; if (seasonNumber && episodeNumber) { for (MLShowEpisode *episodeIter in episodes) { if ([episodeIter.seasonNumber intValue] == [seasonNumber intValue] && [episodeIter.episodeNumber intValue] == [episodeNumber intValue]) { episode = episodeIter; break; } } } if (!episode && createIfNeeded) { episode = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"ShowEpisode"]; episode.episodeNumber = episodeNumber; episode.seasonNumber = seasonNumber; episode.show = show; } return episode; } + (MLShowEpisode *)episodeWithShowName:(NSString *)showName episodeNumber:(NSNumber *)episodeNumber seasonNumber:(NSNumber *)seasonNumber createIfNeeded:(BOOL)createIfNeeded wasCreated:(BOOL *)wasCreated { MLShow *show = [MLShow showWithName:showName]; *wasCreated = NO; if (!show && createIfNeeded) { *wasCreated = YES; show = [[MLMediaLibrary sharedMediaLibrary] createObjectForEntity:@"Show"]; show.name = showName; } else if (!show && !createIfNeeded) return nil; return [MLShowEpisode episodeWithShow:show episodeNumber:episodeNumber seasonNumber:seasonNumber createIfNeeded:createIfNeeded]; } @dynamic primitiveUnread; @dynamic unread; - (void)setUnread:(NSNumber *)unread { [self willChangeValueForKey:@"unread"]; [self setPrimitiveUnread:unread]; [self didChangeValueForKey:@"unread"]; [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] refreshObject:[self show] mergeChanges:YES]; [[[MLMediaLibrary sharedMediaLibrary] managedObjectContext] refreshObject:self mergeChanges:YES]; } @dynamic theTVDBID; @dynamic shortSummary; @dynamic shouldBeDisplayed; @dynamic episodeNumber; @dynamic seasonNumber; @dynamic lastSyncDate; @dynamic artworkURL; @dynamic primitiveArtworkURL; - (void)setArtworkURL:(NSString *)artworkURL { [self willChangeValueForKey:@"artworkURL"]; NSSet *files = self.files; for (id file in files) [file willChangeValueForKey:@"artworkURL"]; [self setPrimitiveArtworkURL:artworkURL]; for (id file in files) [file didChangeValueForKey:@"artworkURL"]; [self didChangeValueForKey:@"artworkURL"]; } @dynamic name; @dynamic show; @dynamic files; @end Sources/MLTVShowEpisodesInfoGrabber.m000066400000000000000000000120031250533726500201030ustar00rootroot00000000000000/***************************************************************************** * MLTVShowEpisodesInfoGrabber.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLTVShowEpisodesInfoGrabber.h" #import "TheTVDBGrabber.h" #import "MLURLConnection.h" @interface MLTVShowEpisodesInfoGrabber () #if !HAVE_BLOCK #endif @property (readwrite, strong) NSDictionary *results; @property (readwrite, strong) NSArray *episodesResults; - (void)didReceiveData:(NSData *)data; @end @implementation MLTVShowEpisodesInfoGrabber @synthesize delegate=_delegate; @synthesize episodesResults=_episodesResults; @synthesize results=_results; #if !HAVE_BLOCK @synthesize userData=_userData; #endif #if !HAVE_BLOCK - (void)urlConnection:(MLURLConnection *)connection didFinishWithError:(NSError *)error { if (error) { _connection = nil; return; } [self didReceiveData:connection.data]; } #endif - (void)lookUpForShowID:(NSString *)showId { [_connection cancel]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_EPISODE_INFO, TVDB_HOSTNAME, TVDB_API_KEY, showId, TVDB_DEFAULT_LANGUAGE]]; // Balanced below #if HAVE_BLOCK _connection = [[MLURLConnection runConnectionWithURL:url andBlock:^(MLURLConnection *connection, NSError * error) { if (error) { [_connection release]; _connection = nil; [self autorelease]; return; } [self didReceiveData:connection.data]; [self autorelease]; }] retain]; #else _connection = [MLURLConnection runConnectionWithURL:url delegate:self userObject:nil]; #endif } #if HAVE_BLOCK - (void)lookUpForShowID:(NSString *)id andExecuteBlock:(void (^)())block { Block_release(_block); _block = Block_copy(block); [self lookUpForShowID:id]; } #endif - (void)didReceiveData:(NSData *)data { NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:data options:0 error:nil]; NSError *error = nil; NSArray *nodesSerie = [xmlDoc nodesForXPath:@"./Data/Series" error:&error]; NSArray *nodesEpisode = [xmlDoc nodesForXPath:@"./Data/Episode" error:&error]; NSString *serieArtworkURL = nil; if ([nodesSerie count] == 1) { NSXMLNode *node = nodesSerie[0]; serieArtworkURL = [node stringValueForXPath:@"./poster"]; } if ([nodesEpisode count] > 0 ) { NSMutableArray *array = [NSMutableArray arrayWithCapacity:[nodesEpisode count]]; for (NSXMLNode *node in nodesEpisode) { NSString *episodeId = [node stringValueForXPath:@"./id"]; if (!episodeId) continue; NSString *title = [node stringValueForXPath:@"./EpisodeName"]; NSNumber *seasonNumber = [node numberValueForXPath:@"./SeasonNumber"]; NSNumber *episodeNumber = [node numberValueForXPath:@"./EpisodeNumber"]; NSString *artworkURL = [node stringValueForXPath:@"./filename"]; NSString *shortSummary = [node stringValueForXPath:@"./Overview"]; [array addObject:@{@"id": episodeId, @"title": title ?: @"", @"shortSummary": shortSummary ?: @"", @"episodeNumber": episodeNumber, @"seasonNumber": seasonNumber, @"artworkURL": [NSString stringWithFormat:TVDB_COVERS_URL, TVDB_IMAGES_HOSTNAME, artworkURL]}]; } self.episodesResults = array; self.results = @{@"serieArtworkURL": [NSString stringWithFormat:TVDB_COVERS_URL, TVDB_IMAGES_HOSTNAME, serieArtworkURL]}; } else { self.episodesResults = nil; self.results = nil; } #if HAVE_BLOCK if (_block) { _block(); Block_release(_block); _block = NULL; } #endif if ([_delegate respondsToSelector:@selector(movieInfoGrabberDidFinishGrabbing:)]) [_delegate tvShowEpisodesInfoGrabberDidFinishGrabbing:self]; } @end Sources/MLTVShowInfoGrabber.m000066400000000000000000000242141250533726500164160ustar00rootroot00000000000000/***************************************************************************** * MLTVShowInfoGrabber.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLTVShowInfoGrabber.h" #import "TheTVDBGrabber.h" #import "MLURLConnection.h" @interface MLTVShowInfoGrabber () #if !HAVE_BLOCK #endif @property (readwrite, strong) NSArray *results; @end @implementation MLTVShowInfoGrabber @synthesize delegate=_delegate; @synthesize results=_results; #if !HAVE_BLOCK @synthesize userData=_userData; #endif static NSDate *gLastFetch = nil; static NSNumber *gServerTime = nil; #if !HAVE_BLOCK - (void)urlConnection:(MLURLConnection *)connection didFinishWithError:(NSError *)error { if ([connection.userObject isEqualToString:@"fetchUpdatesSinceServerTime"]) { // We are coming form -fetchUpdatesSinceServerTime if (error) return; NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:connection.data options:0 error:nil]; NSNumber *serverTime = [[xmlDoc rootElement] numberValueForXPath:@"./Time"]; gServerTime = serverTime; gLastFetch = [NSDate dateWithTimeIntervalSinceNow:0]; NSArray *nodes = [xmlDoc nodesForXPath:@"./Items/Series" error:&error]; NSMutableArray *array = [NSMutableArray arrayWithCapacity:[nodes count]]; for (NSXMLNode *node in nodes) { NSNumber *id = [node numberValueForXPath:@"."]; [array addObject:id]; } [_delegate tvShowInfoGrabber:self didFetchUpdates:array]; } else { NSAssert([connection.userObject isEqualToString:@"fetchServerTime"], @"Unkown callback emitter"); if (error) { [_delegate tvShowInfoGrabberDidFetchServerTime:self]; return; } NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:connection.data options:0 error:nil]; NSNumber *serverTime = [[xmlDoc rootElement] numberValueForXPath:@"./Time"]; gServerTime = serverTime; gLastFetch = [NSDate dateWithTimeIntervalSinceNow:0]; [_delegate tvShowInfoGrabberDidFetchServerTime:self]; } } - (void)fetchUpdatesSinceServerTime:(NSNumber *)serverTime { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_UPDATES, TVDB_HOSTNAME, serverTime]]; [MLURLConnection runConnectionWithURL:url delegate:self userObject:@"fetchUpdatesSinceServerTime"]; } #else + (void)fetchUpdatesSinceServerTime:(NSNumber *)serverTime andExecuteBlock:(void (^)(NSArray *))block { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_UPDATES, TVDB_HOSTNAME, serverTime]]; [MLURLConnection runConnectionWithURL:url andBlock:^(MLURLConnection *connection, NSError *error) { if (error) { return; } NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:connection.data options:0 error:nil]; NSNumber *serverTime = [[xmlDoc rootElement] numberValueForXPath:@"./Time"]; [gServerTime release]; [gLastFetch release]; gServerTime = [serverTime retain]; gLastFetch = [[NSDate dateWithTimeIntervalSinceNow:0] retain]; NSArray *nodes = [xmlDoc nodesForXPath:@"./Items/Series" error:&error]; NSMutableArray *array = [NSMutableArray arrayWithCapacity:[nodes count]]; for (NSXMLNode *node in nodes) { NSNumber *id = [node numberValueForXPath:@"."]; [array addObject:id]; } block(array); }]; } #endif #if !HAVE_BLOCK + (NSNumber *)serverTime { return gServerTime; } - (void)fetchServerTime { if (gLastFetch && gServerTime) { // Only fetch the serverTime every hour // FIXME: Have a default for that? NSDate *oneHourAgo = [NSDate dateWithTimeIntervalSinceNow:5 * 60 /* Every 5 mins */]; if ([oneHourAgo earlierDate:gLastFetch] == gLastFetch) { [_delegate tvShowInfoGrabberDidFetchServerTime:self]; return; } } NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_SERVER_TIME, TVDB_HOSTNAME]]; [MLURLConnection runConnectionWithURL:url delegate:self userObject:@"fetchServerTime"]; } #else + (void)fetchServerTimeAndExecuteBlock:(void (^)(NSNumber *))block { if (gLastFetch && gServerTime) { // Only fetch the serverTime every hour // FIXME: Have a default for that? NSDate *oneHourAgo = [NSDate dateWithTimeIntervalSinceNow:5 * 60 /* Every 5 mins */]; if ([oneHourAgo earlierDate:gLastFetch] == gLastFetch) { block(gServerTime); return; } } NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_SERVER_TIME, TVDB_HOSTNAME]]; [MLURLConnection runConnectionWithURL:url andBlock:^(MLURLConnection *connection, NSError *error) { if (error) { block(nil); return; } [gServerTime release]; [gLastFetch release]; NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:connection.data options:0 error:nil]; NSNumber *serverTime = [[xmlDoc rootElement] numberValueForXPath:@"./Time"]; gServerTime = [serverTime retain]; gLastFetch = [[NSDate dateWithTimeIntervalSinceNow:0] retain]; block(gServerTime); }]; } #endif - (void)lookUpForTitle:(NSString *)title { NSString *escapedString = [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_SEARCH, TVDB_HOSTNAME, escapedString]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15]; [_connection cancel]; _data = [[NSMutableData alloc] init]; // Keep a reference to ourself while we are alive. _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; } - (void)lookUpForShowID:(NSString *)showId { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:TVDB_QUERY_EPISODE_INFO, TVDB_HOSTNAME, TVDB_API_KEY, showId, TVDB_DEFAULT_LANGUAGE]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15]; [_connection cancel]; _data = [[NSMutableData alloc] init]; // Keep a reference to ourself while we are alive. _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; } #if HAVE_BLOCK - (void)lookUpForTitle:(NSString *)title andExecuteBlock:(void (^)())block { Block_release(_block); _block = Block_copy(block); [self lookUpForTitle:title]; } #endif - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { if ([_delegate respondsToSelector:@selector(movieInfoGrabber:didFailWithError:)]) [_delegate tvShowInfoGrabber:self didFailWithError:error]; #if HAVE_BLOCK // Release the eventual block. This prevents ref cycle. if (_block) { Block_release(_block); _block = NULL; } #endif } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_data appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:_data options:0 error:nil]; _data = nil; NSError *error = nil; NSArray *nodes = [xmlDoc nodesForXPath:@"./Data/Series" error:&error]; if ([nodes count] > 0 ) { NSMutableArray *array = [NSMutableArray arrayWithCapacity:[nodes count]]; for (NSXMLNode *node in nodes) { NSString *id = [node stringValueForXPath:@"./seriesid"]; if (!id) continue; NSString *title = [node stringValueForXPath:@"./SeriesName"]; NSString *release = [node stringValueForXPath:@"./FirstAired"]; NSString *releaseYear = nil; if (release) { NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init]; [inputFormatter setDateFormat:@"yyyy-MM-dd"]; NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; [outputFormatter setDateFormat:@"yyyy"]; NSDate *releaseDate = [inputFormatter dateFromString:release]; releaseYear = releaseDate ? [outputFormatter stringFromDate:releaseDate] : nil; } NSString *artworkURL = [node stringValueForXPath:@"./banner"]; NSString *shortSummary = [node stringValueForXPath:@"./Overview"]; [array addObject:@{@"title": title, @"id": id, @"shortSummary": shortSummary ?: @"", @"releaseYear": releaseYear ?: @"", @"banner": [NSString stringWithFormat:TVDB_COVERS_URL, TVDB_IMAGES_HOSTNAME, artworkURL]}]; } self.results = array; } else self.results = nil; #if HAVE_BLOCK if (_block) { _block(); Block_release(_block); _block = NULL; } #endif if ([_delegate respondsToSelector:@selector(movieInfoGrabberDidFinishGrabbing:)]) [_delegate tvShowInfoGrabberDidFinishGrabbing:self]; } @end Sources/MLThumbnailerQueue.h000066400000000000000000000030251250533726500163720ustar00rootroot00000000000000/***************************************************************************** * MLThumbnailerQueue.h * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class MLFile; @interface MLThumbnailerQueue : NSObject + (MLThumbnailerQueue *)sharedThumbnailerQueue; - (void)addFile:(MLFile *)file; - (void)setHighPriorityForFile:(MLFile *)file; - (void)setDefaultPriorityForFile:(MLFile *)file; - (void)stop; - (void)resume; @property (nonatomic, strong) NSOperationQueue *queue; @end Sources/MLThumbnailerQueue.m000066400000000000000000000173701250533726500164070ustar00rootroot00000000000000/***************************************************************************** * MLThumbnailerQueue.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLThumbnailerQueue.h" #import "MLFile.h" #import "MLCrashPreventer.h" #import // for sysctlbyname @interface ThumbnailOperation : NSOperation { MLFile *_file; VLCMedia *_media; VLCLibrary *_internalLibrary; } @property (strong,readwrite) MLFile *file; @end @interface MLThumbnailerQueue () { VLCLibrary *_internalLibrary; NSDictionary *_fileDescriptionToOperation; NSOperationQueue *_queue; } - (void)didFinishOperation:(ThumbnailOperation *)op; @end @implementation ThumbnailOperation @synthesize file=_file; - (id)initWithFile:(MLFile *)file andVLCLibrary:(VLCLibrary *)library; { if (!(self = [super init])) return nil; self.file = file; _internalLibrary = library; return self; } - (void)fetchThumbnail { APLog(@"Starting THUMB %@", self.file); [[MLCrashPreventer sharedPreventer] willParseFile:self.file]; _media = [VLCMedia mediaWithURL:[NSURL URLWithString:self.file.url]]; VLCMediaThumbnailer *thumbnailer = [VLCMediaThumbnailer thumbnailerWithMedia:_media delegate:self andVLCLibrary:_internalLibrary]; /* optimize thumbnails for the device */ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if ([UIScreen mainScreen].scale==2.0) { thumbnailer.thumbnailWidth = 540.; thumbnailer.thumbnailHeight = 405.; } else { thumbnailer.thumbnailWidth = 272.; thumbnailer.thumbnailHeight = 204.; } } else { if (SYSTEM_RUNS_IOS7) { if ([UIScreen mainScreen].scale==2.0) { thumbnailer.thumbnailWidth = 480.; thumbnailer.thumbnailHeight = 270.; } else { thumbnailer.thumbnailWidth = 720.; thumbnailer.thumbnailHeight = 405.; } } else { if ([UIScreen mainScreen].scale==2.0) { thumbnailer.thumbnailWidth = 480.; thumbnailer.thumbnailHeight = 270.; } else { thumbnailer.thumbnailWidth = 240.; thumbnailer.thumbnailHeight = 135.; } } } [thumbnailer fetchThumbnail]; [[MLThumbnailerQueue sharedThumbnailerQueue].queue setSuspended:YES]; // Balanced in -mediaThumbnailer:didFinishThumbnail // Balanced in -mediaThumbnailer:didFinishThumbnail: } - (void)main { [self performSelectorOnMainThread:@selector(fetchThumbnail) withObject:nil waitUntilDone:YES]; } - (void)endThumbnailing { [[MLCrashPreventer sharedPreventer] didParseFile:self.file]; MLThumbnailerQueue *thumbnailer = [MLThumbnailerQueue sharedThumbnailerQueue]; [thumbnailer.queue setSuspended:NO]; [thumbnailer didFinishOperation:self]; } - (void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail { mediaThumbnailer.delegate = nil; APLog(@"Finished thumbnail for %@", self.file.title); self.file.computedThumbnail = [UIImage imageWithCGImage:thumbnail]; [self endThumbnailing]; } - (void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailer { self.file.thumbnailTimeouted = YES; [self endThumbnailing]; } @end @implementation MLThumbnailerQueue @synthesize queue=_queue; + (MLThumbnailerQueue *)sharedThumbnailerQueue { static MLThumbnailerQueue *shared = nil; if (!shared) { shared = [[MLThumbnailerQueue alloc] init]; } return shared; } - (id)init { self = [super init]; if (self != nil) { int speedCategory = [self _deviceSpeedCategory]; APLog(@"running on a category %i device", speedCategory); if (speedCategory < 2) _internalLibrary = [VLCLibrary sharedLibrary]; else _internalLibrary = [[VLCLibrary alloc] initWithOptions:@[@"--avcodec-threads=1", @"--avcodec-skip-idct=4", @"--deinterlace=-1", @"--avcodec-skiploopfilter=3", @"--no-interact", @"--avi-index=3"]]; _fileDescriptionToOperation = [[NSMutableDictionary alloc] init]; _queue = [[NSOperationQueue alloc] init]; [_queue setMaxConcurrentOperationCount:1]; } return self; } static inline NSString *hashFromFile(MLFile *file) { return [NSString stringWithFormat:@"%p", [[file objectID] URIRepresentation]]; } - (void)didFinishOperation:(ThumbnailOperation *)op { [_fileDescriptionToOperation setValue:nil forKey:hashFromFile(op.file)]; } - (void)addFile:(MLFile *)file { if (_fileDescriptionToOperation[hashFromFile(file)]) return; if (![[MLCrashPreventer sharedPreventer] isFileSafe:file]) { APLog(@"'%@' is unsafe and will crash, ignoring", file.title); return; } if ([file isAlbumTrack]) { APLog(@"'%@' is an audio file, ignoring", file.title); return; } ThumbnailOperation *op = [[ThumbnailOperation alloc] initWithFile:file andVLCLibrary:_internalLibrary]; [_fileDescriptionToOperation setValue:op forKey:hashFromFile(file)]; [self.queue addOperation:op]; } - (void)stop { [_queue setMaxConcurrentOperationCount:0]; } - (void)resume { [_queue setMaxConcurrentOperationCount:1]; } - (void)setHighPriorityForFile:(MLFile *)file { ThumbnailOperation *op = _fileDescriptionToOperation[hashFromFile(file)]; [op setQueuePriority:NSOperationQueuePriorityHigh]; } - (void)setDefaultPriorityForFile:(MLFile *)file { ThumbnailOperation *op = _fileDescriptionToOperation[hashFromFile(file)]; [op setQueuePriority:NSOperationQueuePriorityNormal]; } - (int)_deviceSpeedCategory { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *answer = malloc(size); sysctlbyname("hw.machine", answer, &size, NULL, 0); NSString *currentMachine = @(answer); free(answer); if ([currentMachine hasPrefix:@"iPhone2"] || [currentMachine hasPrefix:@"iPhone3"] || [currentMachine hasPrefix:@"iPhone4"] || [currentMachine hasPrefix:@"iPod3"] || [currentMachine hasPrefix:@"iPod4"] || [currentMachine hasPrefix:@"iPad2"]) { // iPhone 3GS, iPhone 4, 3rd and 4th generation iPod touch, iPad 2, iPad mini (1st gen) return 1; } else if ([currentMachine hasPrefix:@"iPad3,1"] || [currentMachine hasPrefix:@"iPad3,2"] || [currentMachine hasPrefix:@"iPad3,3"] || [currentMachine hasPrefix:@"iPod5"]) { // iPod 5, iPad 3 return 2; } else if ([currentMachine hasPrefix:@"iPhone5"] || [currentMachine hasPrefix:@"iPhone6"] || [currentMachine hasPrefix:@"iPad4"]) { // iPhone 5 + 5S, iPad 4, iPad Air, iPad mini 2G return 3; } else // iPhone 6, 2014 iPads return 4; } @end Sources/MLTitleDecrapifier.m000066400000000000000000000176641250533726500163550ustar00rootroot00000000000000/***************************************************************************** * MLTitleDecrapifier.m * Lunettes ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLTitleDecrapifier.h" @implementation MLTitleDecrapifier + (NSString *)decrapify:(NSString *)string { static NSArray *ignoredWords = nil; if (!ignoredWords) ignoredWords = [[NSArray alloc] initWithObjects: @"xvid", @"h264", @"dvd", @"rip", @"divx", @"[fr]", @"720p", @"1080i", @"1080p", @"x264", @"hdtv", @"aac", @"bluray", nil]; NSMutableString *mutableString = [NSMutableString stringWithString:string]; for (NSString *word in ignoredWords) [mutableString replaceOccurrencesOfString:word withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableString length])]; [mutableString replaceOccurrencesOfString:@"." withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableString length])]; [mutableString replaceOccurrencesOfString:@"_" withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableString length])]; [mutableString replaceOccurrencesOfString:@"+" withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableString length])]; [mutableString replaceOccurrencesOfString:@"-" withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableString length])]; NSString *staticString = [NSString stringWithString:mutableString]; mutableString = nil; while ([staticString rangeOfString:@" "].location != NSNotFound) staticString = [staticString stringByReplacingOccurrencesOfString:@" " withString:@" "]; if (staticString.length > 2) { @try { if ([staticString characterAtIndex:0] == 0x20) staticString = [staticString substringFromIndex:1]; } @catch (NSException *exception) { } } return staticString; } static inline BOOL isDigit(char c) { return c >= '0' && c <= '9'; } // Shortcut to ease reading static inline unichar c(NSString *string, unsigned index) { @try { return [string characterAtIndex:index]; } @catch (NSException *exception) { return 0x00; } } + (BOOL)isTVShowEpisodeTitle:(NSString *)string { NSString *str = [string lowercaseString]; // Search for s01e10. for (int i = 0; i < (int)[str length] - 5; i++) { if (c(str, i) == 's' && isDigit(c(str, i+1)) && isDigit(c(str, i+2)) && c(str, i+3) == 'e' && isDigit(c(str, i+4)) && isDigit(c(str, i+5))) { return YES; } } return NO; } static inline int intFromChar(char n) { return n - '0'; } static inline NSNumber *numberFromTwoChars(char high, char low) { return @(intFromChar(high) * 10 + intFromChar(low)); } static inline NSNumber *numberFromThreeChars(char high, char mid, char low) { return @(intFromChar(high) * 100 + intFromChar(mid) * 10 + intFromChar(low)); } + (NSDictionary *)tvShowEpisodeInfoFromString:(NSString *)string { if (!string) return nil; NSString *str = [string lowercaseString]; BOOL successfulSearch = NO; NSMutableDictionary *mutableDict; NSUInteger stringLength = [str length]; if (stringLength < 6) return nil; // Search for s01e10. for (unsigned int i = 0; i < stringLength - 5; i++) { if (c(str, i) == 's' && isDigit(c(str, i+1)) && isDigit(c(str, i+2)) && c(str, i+3) == 'e' && isDigit(c(str, i+4)) && isDigit(c(str, i+5))) { NSNumber *season = numberFromTwoChars(c(str,i+1), c(str,i+2)); NSNumber *episode; if (isDigit(c(str, i+6))) episode = numberFromThreeChars(c(str,i+4), c(str,i+5), c(str,i+6)); else episode = numberFromTwoChars(c(str,i+4), c(str,i+5)); NSString *tvShowName = i > 0 ? [str substringToIndex:i] : NSLocalizedString(@"UNTITLED_SHOW", @""); tvShowName = tvShowName ? [[MLTitleDecrapifier decrapify:tvShowName] capitalizedString] : nil; NSString *episodeName = stringLength > i + 4 ? [str substringFromIndex:i+6] : nil; episodeName = episodeName ? [MLTitleDecrapifier decrapify:episodeName] : nil; mutableDict = [[NSMutableDictionary alloc] initWithCapacity:4]; if (season) mutableDict[@"season"] = season; if (episode) mutableDict[@"episode"] = episode; if (tvShowName && ![tvShowName isEqualToString:@" "]) mutableDict[@"tvShowName"] = tvShowName; if (episodeName.length > 0 && ![episodeName isEqualToString:@" "]) mutableDict[@"tvEpisodeName"] = [episodeName capitalizedString]; successfulSearch = YES; } } // search for 0x00 if (!successfulSearch) { for (unsigned int i = 0; i < stringLength - 4; i++) { if (isDigit(c(str, i)) && c(str, i+1) == 'x' && isDigit(c(str, i+2)) && isDigit(c(str, i+3))) { NSNumber *season = @(intFromChar(c(str,i))); NSNumber *episode = numberFromTwoChars(c(str,i+2), c(str,i+3)); NSString *tvShowName = i > 0 ? [str substringToIndex:i] : NSLocalizedString(@"UNTITLED_SHOW", @""); tvShowName = tvShowName ? [[MLTitleDecrapifier decrapify:tvShowName] capitalizedString] : nil; NSString *episodeName = stringLength > i + 4 ? [str substringFromIndex:i+4] : nil; episodeName = episodeName ? [MLTitleDecrapifier decrapify:episodeName] : nil; mutableDict = [[NSMutableDictionary alloc] initWithCapacity:3]; if (season) mutableDict[@"season"] = season; if (episode) mutableDict[@"episode"] = episode; if (tvShowName && ![tvShowName isEqualToString:@" "]) mutableDict[@"tvShowName"] = tvShowName; if (episodeName.length > 0 && ![episodeName isEqualToString:@" "]) mutableDict[@"tvEpisodeName"] = [episodeName capitalizedString]; successfulSearch = YES; } } } if (successfulSearch) { NSDictionary *dict = [NSDictionary dictionaryWithDictionary:mutableDict]; return dict; } return nil; } + (NSDictionary *)audioContentInfoFromFile:(MLFile *)file { if (!file) return nil; NSString *title = file.title; NSArray *components = [title componentsSeparatedByString:@" "]; if (components.count > 0) { if ([components[0] intValue] > 0) title = [self decrapify:[title stringByReplacingOccurrencesOfString:components[0] withString:@""]]; } else title = [self decrapify:title]; return @{VLCMetaInformationTitle: title}; } @end Sources/MLURLConnection.m000066400000000000000000000070321250533726500156040ustar00rootroot00000000000000/***************************************************************************** * MLURLConnection.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MLURLConnection.h" #if HAVE_BLOCK @interface MLURLConnection () - (void)loadURL:(NSURL *)url andPerformBlock:(void (^)(MLURLConnection *connection, NSError *error))block; @end #endif @implementation MLURLConnection @synthesize data=_data; @synthesize delegate=_delegate; @synthesize userObject=_userObject; #if HAVE_BLOCK + (id)runConnectionWithURL:(NSURL *)url andBlock:(void (^)(MLURLConnection *connection, NSError *error))block { id obj = [[[[self class] alloc] init] autorelease]; [obj loadURL:url andPerformBlock:block]; return obj; } #else + (id)runConnectionWithURL:(NSURL *)url delegate:(id)delegate userObject:(id)userObject { MLURLConnection *obj = [[[self class] alloc] init]; obj.delegate = delegate; obj.userObject = userObject; [obj loadURL:url]; return obj; } #endif - (void)loadURL:(NSURL *)url { _data = [[NSMutableData alloc] init]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15]; [_connection cancel]; _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; // Make sure we are around during the request } #if HAVE_BLOCK - (void)loadURL:(NSURL *)url andPerformBlock:(void (^)(MLURLConnection *connection, NSError *error))block { if (_block) Block_release(_block); _block = block ? Block_copy(block) : NULL; [self loadURL:url]; } #endif - (void)cancel { [_connection cancel]; _connection = nil; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { #if HAVE_BLOCK // Call the call back with the error. _block(self, error); // Release the eventual block. This prevents ref cycle. if (_block) { Block_release(_block); _block = NULL; } #endif [_delegate urlConnection:self didFinishWithError:error]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_data appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { #if HAVE_BLOCK // Call the call back with the data. _block(self, nil); // Release the eventual block. This prevents ref cycle. if (_block) { Block_release(_block); _block = NULL; } #endif [_delegate urlConnection:self didFinishWithError:nil]; } @end Sources/NSXMLNode_Additions.m000066400000000000000000000033571250533726500164040ustar00rootroot00000000000000/***************************************************************************** * NSXMLNode_Additions.m * MobileMediaLibraryKit ***************************************************************************** * Copyright (C) 2010 Pierre d'Herbemont * Copyright (C) 2010-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @implementation NSXMLNode (MLAdditions) - (NSString *)stringValueForXPath:(NSString *)string { NSArray *nodes = [self nodesForXPath:string error:nil]; if ([nodes count] == 0) return nil; return [nodes[0] stringValue]; } - (NSNumber *)numberValueForXPath:(NSString *)string { NSArray *nodes = [self nodesForXPath:string error:nil]; if ([nodes count] == 0) return nil; NSScanner *scanner = [NSScanner scannerWithString:[nodes[0] stringValue]]; NSInteger i; if ([scanner scanInteger:&i]) return @(i); return nil; } @end