./COPYING0000644000076500007650000004312710126107454011671 0ustar hnshns00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's 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 give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 Program 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 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 Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. 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) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./COPYING.rtf0000644000076500007650000004441510225777347012502 0ustar hnshns00000000000000{\rtf1\mac\ansicpg10000\cocoartf802 {\fonttbl\f0\fmodern\fcharset77 Courier;} {\colortbl;\red255\green255\blue255;} {\info}\paperw11900\paperh16840\margl1440\margr1440\vieww9000\viewh8400\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\fs24 \cf0 GNU GENERAL PUBLIC LICENSE\ Version 2, June 1991\ \ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\ Everyone is permitted to copy and distribute verbatim copies\ of this license document, but changing it is not allowed.\ \ Preamble\ \ The licenses for most software are designed to take away your\ freedom to share and change it. By contrast, the GNU General Public\ License is intended to guarantee your freedom to share and change free\ software--to make sure the software is free for all its users. This\ General Public License applies to most of the Free Software\ Foundation's software and to any other program whose authors commit to\ using it. (Some other Free Software Foundation software is covered by\ the GNU Library General Public License instead.) You can apply it to\ your programs, too.\ \ When we speak of free software, we are referring to freedom, 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 or use pieces of it\ in new free programs; and that you know you can do these things.\ \ To protect your rights, we need to make restrictions that forbid\ anyone to deny you these rights or to ask you to surrender the rights.\ These restrictions translate to certain responsibilities for you if you\ distribute copies of the software, or if you modify it.\ \ For example, if you distribute copies of such a program, whether\ gratis or for a fee, you must give the recipients all the rights that\ you have. You must make sure that they, too, receive or can get the\ source code. And you must show them these terms so they know their\ rights.\ \ We protect your rights with two steps: (1) copyright the software, and\ (2) offer you this license which gives you legal permission to copy,\ distribute and/or modify the software.\ \ Also, for each author's protection and ours, we want to make certain\ that everyone understands that there is no warranty for this free\ software. If the software is modified by someone else and passed on, we\ want its recipients to know that what they have is not the original, so\ that any problems introduced by others will not reflect on the original\ authors' reputations.\ \ Finally, any free program is threatened constantly by software\ patents. We wish to avoid the danger that redistributors of a free\ program will individually obtain patent licenses, in effect making the\ program proprietary. To prevent this, we have made it clear that any\ patent must be licensed for everyone's free use or not licensed at all.\ \ The precise terms and conditions for copying, distribution and\ modification follow.\ \page \ GNU GENERAL PUBLIC LICENSE\ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\ \ 0. This License applies to any program or other work which contains\ a notice placed by the copyright holder saying it may be distributed\ under the terms of this General Public License. The "Program", below,\ refers to any such program or work, and a "work based on the Program"\ means either the Program or any derivative work under copyright law:\ that is to say, a work containing the Program or a portion of it,\ either verbatim or with modifications and/or translated into another\ language. (Hereinafter, translation is included without limitation in\ the term "modification".) Each licensee is addressed as "you".\ \ Activities other than copying, distribution and modification are not\ covered by this License; they are outside its scope. The act of\ running the Program is not restricted, and the output from the Program\ is covered only if its contents constitute a work based on the\ Program (independent of having been made by running the Program).\ Whether that is true depends on what the Program does.\ \ 1. You may copy and distribute verbatim copies of the Program's\ 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 give any other recipients of the Program a copy of this License\ along with the Program.\ \ 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 Program or any portion\ of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices\ stating that you changed the files and the date of any change.\ \ b) You must cause any work that you distribute or publish, that in\ whole or in part contains or is derived from the Program or any\ part thereof, to be licensed as a whole at no charge to all third\ parties under the terms of this License.\ \ c) If the modified program normally reads commands interactively\ when run, you must cause it, when started running for such\ interactive use in the most ordinary way, to print or display an\ announcement including an appropriate copyright notice and a\ notice that there is no warranty (or else, saying that you provide\ a warranty) and that users may redistribute the program under\ these conditions, and telling the user how to view a copy of this\ License. (Exception: if the Program itself is interactive but\ does not normally print such an announcement, your work based on\ the Program is not required to print an announcement.)\ \page \ These requirements apply to the modified work as a whole. If\ identifiable sections of that work are not derived from the Program,\ 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 Program, 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 Program.\ \ In addition, mere aggregation of another work not based on the Program\ with the Program (or with a work based on the Program) on a volume of\ a storage or distribution medium does not bring the other work under\ the scope of this License.\ \ 3. You may copy and distribute the Program (or a work based on it,\ under Section 2) in object code or executable form under the terms of\ Sections 1 and 2 above provided that you also do one of the following:\ \ a) 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; or,\ \ b) Accompany it with a written offer, valid for at least three\ years, to give any third party, for a charge no more than your\ cost of physically performing source distribution, a complete\ machine-readable copy of the corresponding source code, to be\ distributed under the terms of Sections 1 and 2 above on a medium\ customarily used for software interchange; or,\ \ c) Accompany it with the information you received as to the offer\ to distribute corresponding source code. (This alternative is\ allowed only for noncommercial distribution and only if you\ received the program in object code or executable form with such\ an offer, in accord with Subsection b above.)\ \ The source code for a work means the preferred form of the work for\ making modifications to it. For an executable work, 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 executable. However, as a\ special exception, the source code 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.\ \ If distribution of executable or 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 counts as\ distribution of the source code, even though third parties are not\ compelled to copy the source along with the object code.\ \page \ 4. You may not copy, modify, sublicense, or distribute the Program\ except as expressly provided under this License. Any attempt\ otherwise to copy, modify, sublicense or distribute the Program 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.\ \ 5. 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 Program or its derivative works. These actions are\ prohibited by law if you do not accept this License. Therefore, by\ modifying or distributing the Program (or any work based on the\ Program), you indicate your acceptance of this License to do so, and\ all its terms and conditions for copying, distributing or modifying\ the Program or works based on it.\ \ 6. Each time you redistribute the Program (or any work based on the\ Program), the recipient automatically receives a license from the\ original licensor to copy, distribute or modify the Program 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 to\ this License.\ \ 7. 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 Program at all. For example, if a patent\ license would not permit royalty-free redistribution of the Program 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 Program.\ \ 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.\ \page \ 8. If the distribution and/or use of the Program is restricted in\ certain countries either by patents or by copyrighted interfaces, the\ original copyright holder who places the Program 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.\ \ 9. The Free Software Foundation may publish revised and/or new versions\ of the 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 Program\ 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 Program does not specify a version number of\ this License, you may choose any version ever published by the Free Software\ Foundation.\ \ 10. If you wish to incorporate parts of the Program into other free\ programs whose distribution conditions are different, 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\ \ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\ PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE\ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\ REPAIR OR CORRECTION.\ \ 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER\ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\ POSSIBILITY OF SUCH DAMAGES.\ \ END OF TERMS AND CONDITIONS\ \page \ How to Apply These Terms to Your New Programs\ \ If you develop a new program, and you want it to be of the greatest\ possible use to the public, the best way to achieve this is to make it\ free software which everyone can redistribute and change under these terms.\ \ To do so, attach the following notices to the program. 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) 19yy \ \ This program is free software; you can redistribute it and/or modify\ it under the terms of the GNU General Public License as published by\ the Free Software Foundation; either version 2 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 General Public License for more details.\ \ You should have received a copy of the GNU General Public License\ along with this program; if not, write to the Free Software\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\ \ \ Also add information on how to contact you by electronic and paper mail.\ \ If the program is interactive, make it output a short notice like this\ when it starts in an interactive mode:\ \ Gnomovision version 69, Copyright (C) 19yy name of author\ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\ This is free software, and you are welcome to redistribute it\ under certain conditions; type `show c' for details.\ \ The hypothetical commands `show w' and `show c' should show the appropriate\ parts of the General Public License. Of course, the commands you use may\ be called something other than `show w' and `show c'; they could even be\ mouse-clicks or menu items--whatever suits your program.\ \ You should also get your employer (if you work as a programmer) or your\ school, if any, to sign a "copyright disclaimer" for the program, if\ necessary. Here is a sample; alter the names:\ \ Yoyodyne, Inc., hereby disclaims all copyright interest in the program\ `Gnomovision' (which makes passes at compilers) written by James Hacker.\ \ , 1 April 1989\ Ty Coon, President of Vice\ \ This General Public License does not permit incorporating your program into\ proprietary programs. If your program is a subroutine library, you may\ consider it more useful to permit linking proprietary applications with the\ library. If this is what you want to do, use the GNU Library General\ Public License instead of this License.\ }./Call Sequence.rtf0000644000076500007650000000312510272666543013764 0ustar hnshns00000000000000{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf100 {\fonttbl\f0\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \paperw11900\paperh16840\margl1440\margr1440\vieww19180\viewh8240\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\fs24 \cf0 init\ start\ configureDevice\ initDevice\ createNetworkInterface\ configureInterface\ register as power controller\ setPowerState on\ enable\ wakeUp\ --- communicating ---\ disable\ putToSleep\ setPowerState off\ System Sleep\ --- sleep ---\ System Wake\ Wake event 0001\ setPowerState on\ enable\ wakeUp\ --- no route to host etc. ---\ --- device off ---\ disable\ putToSleep\ message\ stop\ free\ --- device on ---\ init\ start\ configureDevice\ initDevice\ createNetworkInterface\ configureInterface\ start (again???)\ setPowerState on\ enable\ wakeUp\ --- communication resumed ---\ \ \ \ Ger\'8ate in umgekehrter Reihenfolge einschalten wie ausgeschaltet!!!\ \ Off-Reihenfolge On-Reihenfolge Effekt\ 1. PB,Z Z,PB PB bekommt es gar nicht mit, m\'9fsste durch USB-Reset nach Power-On behoben sein\ 2. PB,Z PB,Z PB hat nicht mitbekommten, dass Z eigentlich off ist -> USB geht ins Nirwana und h\'8angt ggf.\ bzw. Z on nach PB on initialisiert USB neu\ 3. Z,PB PB,Z PB initialisiert USB nicht wieder -> Z off/on notwengig\ 4. Z,PB Z,PB PB entfernt Treiber, merkt nicht dass Z schon an ist\ \ PB entfernt den Treiber aus dem Kernel, wenn Zaurus nicht (mehr) angeschlossen ist.\ \ 1. gibt es gar nicht, weil Z off das PB aufweckt!\ }./HISTORY.rtf0000644000076500007650000000307510531054014012503 0ustar hnshns00000000000000{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420 {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 ArialMT; } {\colortbl;\red255\green255\blue255;\red0\green39\blue237;} \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\b\fs38 \cf0 History \f1\b0\fs28 \ \ \f0\b Version 0.50 \f1\b0 \ * made working as a Univeral Binary on Xcode 2.4 on MacOS X 10.4.8\ * on a PowerBook G4 and a MacBook Pro\ * fixed a bug with handling the packet size\ * reworked identification of Interfaces and Endpoints\ * debugged and fixed some Kernel Panics\ * added default IP addresses to the property lists (isn't used for anything useful)\ \ \f0\b Version 0.34\ \f1\b0 * separated source code into several modules\ * modified project to compile a Univeral Binary on Xcode 2.4 on MacOS X 10.4.7\ * experimented with remote debugging \f2\fs20 \cf2 \ \f1\fs28 \cf0 \ \f0\b Version 0.33\ \f1\b0 * added iPAQ 3900\ * increased buffer size and waiting threshold to avoid stalling problems \f2\fs20 \cf2 \ \f1\fs28 \cf0 \ \f0\b Version 0.32\ \f1\b0 * added Motorola A780 and Ming (not tested) - contributed by \f2\fs26 \cf2 http://wiki.openezx.org/Get_a_shell \f1\fs28 \cf0 \ * added Nokia N770 (not tested / not working)\ * added Acer n30 (although not working)\ * compiled with Xcode 2.2.1 on MacOS X 10.4.6 on PowerPC \ \ \f0\b Version 0.31\ \f1\b0 * added Zaurus C3000, C3100, C1000\ \ \f0\b Version 0.30\ \f1\b0 * Compiled for Tiger\ \ \f0\b Version 0.28\ \f1\b0 * Compiled for Tiger}./README.rtfd/0000755000076500007650000000000010335400320012510 5ustar hnshns00000000000000./README.rtfd/Pasted Graphic 1.tiff0000644000076500007650000502103210335400320016264 0ustar hnshns00000000000000MM*4FF Fvvv<<<<<SOc]c^c]b\RO<>6:N a [8ʁ?ܛFLNNKښFʂ?[9s% HH;;*};;Q@Au%*$$FE?8%ދg,i ;H^v;;;Hͻ;^IJ*gڻH]Чn;HvÖHv};ܺSn;;v*nY*+A;QHcZoixpyqtke\SIB;)*Zz0{+"*BPWWOA+!~+{0;;ܶ;];;SS̶fHHSHS;ܱvS;]};SHf;;}Sfn=?1*UKh]vn}~xni_UK1)p=?V=́'4BRcjkdTB6Є'V>;;̧nHvH;S***;];ЧnH̶HfufnHHSHߺ;SS{{)$`Yxo|~yoaZ(${{{{ATaoyzrbUA{{;;]HSn;Ԭ;**v]*};f;S;;Hv;}87VQ|}ZR76h/ߨ=_r}~sa=i0;)ܺSHHnǺܺ;H|HHЧnfܺ]ȱ**v;;;].)piwo1,u#ۻPwyU{#;HصS]SuH)Ö]ԫ;;|Ǧ|HnߺH;;S)UP`Xʈߟ⤚͊d]XQ{CBgjEE_[NFNFb^P55Qzzzlklffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzzzzlklfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzwwwvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvwww|||{{{|||{{{rrrrrrrrrrrrfffffffffffffffffffff̾̾fffssssssfffffffffֺJJq޿UJU+fff```]]][[[[[[]]]```fffeeeffffffҦ+`V`==VV==Jfff^^^iiiiii^^^fffkkkGGGGGGffffff==ܬ+====fffZZZZZZfffoooGGGGGGGGGGGGffffff‰z==W+W++W=js=+W++zƐKWW===fffkkkYYYYYYkkkfffzzzHHHHHHHHHHHHHHHHHHffffffs=jK=s¸W{s+j̳j+sa==aajjss===fffiiiYYYYYYiiifffHHHHHHHHHHHHHHHHHHHHHHHHffffffWkLL͗W>Ñȑڴs,sb>㾊ѝb>>>fffYYYYYYfffkkkA@@@AAA@A@@@@@@@@@ffffffȯoD77DDϳ'|˦7oXDo'XvOX7DONN7`77|ӯ7|fffYYYnnnnnnYYYffffffBBBABBBBBBBBffffffϟY88~EEӲ~ַ~E(өq((iˤ(ExxP888~ײ8~fffZZZ^^^aaaaaa^^^ZZZYYYyyyfffbbbCCBCCBffffffyrP99FFcFrƴr9cZrү9PFյZ99ٵ9fffggggggppp[[[}}}fff```ffffff[s::RRͭ[))ḍ)GGl{))st)G::ܶGfffppp\\\}}}ffffffffffffppp^^^ffffffffffffffffffffffffrrrrrrrrrrrrrrrfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrrrrrffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrr__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::f&.az"^ ˤIUpUpxJJUUUUUUUU__hh_U_ekn%I>>>ڹWLsb[j{b4b+3_d8nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhh__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::Ϳf&.az"^ h*x*xUUxqUxh+xekn%˙_pxU_IJh++<<̙_qxU_U!*Piy*v?K==II<<*<L㾊WbW{L,͝bߴ>>ѯLsL>>W,WW{L,WLs{L{L,ڹWLs͗>s[j{b4b+3_d8nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhh׽âTTaaTTâͥ\O\O\f\ff\\\\fpץ.͉ҟy͉.͉A.yyp~~vggӈӈggv~~\\f.AOpy\AAͱ.Oґ‘.ґ.ґ͑A.AAґ..ğzpp묬묬ppzğ.AAAfAґAAO.fpןAfץAAfpOґ..׫O\ץpAfyO,s\ןffȟpOOҘff.fpAOypO.pAOypO.ͥpOןAOypAAf\͑A.‰O巂Oױ\ҟ\......\OO##__tt]]]]tt__##OOҘO\\f.p.A\AAҘO\\..\fAff̟.\yAO͑ҘpґOp\fpҘO.y͑A.A\O͉AAAOpOpןfp.ҘOױ.ག͑A..ܥApp.A.yt00000000tppyyA\yAApy.p׽p.yOf\.AAOpґґҘApҘfט͑A.ґA.͑A.A.fO͉AAAAAAApAyy\ґAAґ͑A.\ApҘO\טAAOґA.{{ȑܥfAOpO.A.O͘ҘAfן\O.\ґґґ͑yґ͑A.͑A.͑A.pfO͉AAAAAAAґOAґAAґ͑A.ȉ.yAAґApҘA.AO͑A.FFFFfAO\\\ApAAAfҟ.AAҘOOןOfpyґґґ.ȑAO͑A.͉.͑A.͉.A.y͉AOAAAAטOґAA͉͑A.p.͑fAOAO͑A. .O\AAAAA͑ҘAA͑OOҘOOґ.ґ.ґ.ཉfґAAץOґAAOAfOOpfOAOAOȟpAґ.OAf\ґAAyOOfAOґA..aaFFggggRRaaҟ\O͘fAAAApOApAA‚Apyy<<))))<DC7͏ܯޜ^ުKۤ>ۣ=٠;֜9Ӗ8ϐ8ˉ7͒TX<=+Ə=ƏKƕV`==ƏKƏ=ƕVƏ=+Ə=ʏK+KrƕV`Ə=+=rK=+ʛ`=Ə=+V=ϕ=V+==Ə=+==KƏKƏ=++==V+=K+==Ӳ=+=+===ƏK+ƕVj==lll[:GRRR:ddGlԻzR)z::жG)dGG::ػGܶ:R)))))dkkk̬ɩ̬ս̬ؽc:?Ā@V7g5龏ͧ܎^ۘIؓ@֏=֐;Ґ9Ό8Ȇ7~5LQ8ϡV+Ə=ƏK=zzK==Ə=Ə=+Ə=+=`=K=ƏK=zzKƏ=+V=Kz+ʕKzƏ=+=`ʕV`rVj=`+==Ə=+===Ə=Ə=++===`+`++===VϕK++==Kjr=+Kzԫ)H||S;n|SH;;áH]HH;)ܾ;ߺ;;]έέȪȦ˪l>Ň6z?jA|;ϔ֣ߘ`߳QܪJۦG٢D֞Bә@ˍ=ņ<†KR;_hǹpp*desc ,ddscm Jmmod (cprt -XYZ h < XYZ kgY%XYZ #dqXYZ Rsf32 B&lcurvcurvcurvvcgt !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !#%')+-/0235689:<=>?ABCDEGHIJKLMNOPQRSTUVVWXYZ[\\]^_`aabcdeefghiijkllmnoopqrrstuuvwxxyzz{|}}~ndin63W P' OP T9@@ "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e* #,4<CJQZblv.CXo"Eh 8iMI`EI  x [ N M Z v D5>m3^?#  !"#$%&()*0+K,h-./1273s457C89;&Th|Þūǵɹ˷ͭϝшlL%ڿ܀83_iI3fj3>g{desc Color LCDmluc enUS(deDE:Color LCDFarb-LCDmmod itextCopyright Apple Computer, Inc., 2005./README.rtfd/Pasted Graphic 2.tiff0000644000076500007650000502103210331471332016274 0ustar hnshns00000000000000MM*4 "SOc]c^c]b\RO<>6:N a [8ʁ?ܛFLNNKښFʂ?[9s% HH;;*};;Q@Au%*$$FE?8%ދg,i ;H^v;;;Hͻ;^IJ*gڻH]Чn;HvÖHv};ܺSn;;v*nY*+A;QHcZoixpyqtke\SIB;)*Zz0{+"*BPWWOA+!~+{0;;ܶ;];;SS̶fHHSHS;ܱvS;]};SHf;;}Sfn=?1*UKh]vn}~xni_UK1)p=?V=́'4BRcjkdTB6Є'V>;;̧nHvH;S***;];ЧnH̶HfufnHHSHߺ;SS{{)$`Yxo|~yoaZ(${{{{ATaoyzrbUA{{;;]HSn;Ԭ;**v]*};f;S;;Hv;}87VQ|}ZR76h/ߨ=_r}~sa=i0;)ܺSHHnǺܺ;H|HHЧnfܺ]ȱ**v;;;].)piwo1,u#ۻPwyU{#;HصS]SuH)Ö]ԫ;;|Ǧ|HnߺH;;S)UP`Xʈߟ⤚͊d]XQ{CBgjEE_[NFNFb^P55Qzzzlklffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzzzzlklfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzwwwvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvwww|||{{{|||{{{rrrrrrrrrrrrfffffffffffffffffffff̾̾fffssssssfffffffffֺJJq޿UJU+fff```]]][[[[[[]]]```fffeeeffffffҦ+`V`==VV==Jfff^^^iiiiii^^^fffkkkGGGGGGffffff==ܬ+====fffZZZZZZfffoooGGGGGGGGGGGGffffff‰z==W+W++W=js=+W++zƐKWW===fffkkkYYYYYYkkkfffzzzHHHHHHHHHHHHHHHHHHffffffs=jK=s¸W{s+j̳j+sa==aajjss===fffiiiYYYYYYiiifffHHHHHHHHHHHHHHHHHHHHHHHHffffffWkLL͗W>Ñȑڴs,sb>㾊ѝb>>>fffYYYYYYfffkkkA@@@AAA@A@@@@@@@@@ffffffȯoD77DDϳ'|˦7oXDo'XvOX7DONN7`77|ӯ7|fffYYYnnnnnnYYYffffffBBBABBBBBBBBffffffϟY88~EEӲ~ַ~E(өq((iˤ(ExxP888~ײ8~fffZZZ^^^aaaaaa^^^ZZZYYYyyyfffbbbCCBCCBffffffyrP99FFcFrƴr9cZrү9PFյZ99ٵ9fffggggggppp[[[}}}fff```ffffff[s::RRͭ[))ḍ)GGl{))st)G::ܶGfffppp\\\}}}ffffffffffffppp^^^ffffffffffffffffffffffffrrrrrrrrrrrrrrrfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrrrrrffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrr__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::f&.az"^ ˤIUpUpxJJUUUUUUUU__hh_U_ekn%I>>>ڹWLsb[j{b4b+3_d8nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhh__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::f&.az"^ h*x*x_U__UUUUUUUJJq+ݾUJU++_xѥJ+Uxᾀhekn%˙_pxU_I<JhJUUÍ<+Í<+ժhUȟqð<>ھ>W>>ȗL>LbW{L,,,{{,L>>͗WWb,bڹ,LȗL>LȗL>ڹWLsbb,bLbL>>͗WW͗W>֩kW[j{b4>},b+3_d8ѧ~̡nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhhRRnimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwuuuttt|||wwFFDD!N||| (%l~¸¸B9[IJJWwaq\kha|MG<3|J3a$q)Xaqx2$Am<JiqU<<<JiqU<<ĎJ`y`+ĎJ`yUUĎ<+ѵiJ+`yJĎ<+<JiqU<<ɚ`U<JiJcJ{J#K=r^2(ujO=|Z#?^2(p^1^f<<_<<<_<ÍJJٵÍJJ٪+<Í<+ȓ<Í<+<<_<<<+<+nE|w=$1w^3(qwKVr^3(qZKGf<<ĎJU<<ĎJUĎJJɎiJĎJJĎJUUi+<`+``<`i+yĎ<+޿q<ĎֺJUy<Ď<+U+i<<ĎJU`<``iJq<<`i+i͠i+U޿q<ֵq<U<<ĔUiJyy<+iֵ++q`<``͠i+`JqUJyiU(wJ]emnpppppppppp\g=jppjCpppppppC,gpn1yeppe|igppC,bpjCpc#lppppppppppp0z88˲bq88˲bqEEqE~Ex˿qEP~bbiiӲPiEiEY~Y(8(iYY(ӷ~xxbײ8~8(~E88˲bqEY~Ex˿qEϲ(qEq8(~iYY(q(Y8YéY(bײPPxE8~׻i˷x88EYE(~Y~8Eò8Y(b4Qgpwz{{{{{{{{{{el>!u{{uM{{{{{{{M8,!LV{{{SAg{{{I.g{u!,Al{{{{{{{{{{{?G):)GG):)GR))eݽR){\:R)::::):ֳŔ\ݸGtҪt:mݸG::)ڽmŸ{ڽť)ݸ:G:eG):)G:\ݽR){\:e):::)ڽmŸ{m)G):::::))R::ݸG\)::G\::\G:ݸ:ݽRRɳeGG:[lulp?"}}GN0Lag)RN0!k}5kdnC;];]S}SHHHHH];HSSS;f;Ð};;H;;*ܿ**;̱ܿ;;;;;S};];;SHHHvS;*ܿ**;ٿ}S*};;;;;;;S*****f;;;;HS***;];AeurtA#=S2#ofxS2#oST<<<<ĎJJU>>>ʙXXuMʙX>,,}},MX,,uM,>>ʙM>MʓXMu}MMʙM>ϥuM>>>>uMX>ϟ,,uʙM>McM,}M>>>X>>ʙM>McX}M,OrAm???YryYu.pp|ҷ]b|wmmm___XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX___mmm__][Z__XZ_Y_]]Y\_FFpmmii&&y*A88f&.az"^ R)):Rd{::G:)R{GllRlɤdR\\\\RRR\dlټtRG{x_UU_q_JUx++ekn%l)GtlG:)\R))ٷ:d{tG)\R:<<џJJÍ<+U!*Piy*v?ÖHS;;;ܿH*nȜfHU*pUU<<*[d y,{MSԺHff*;n;*fH******;;;;fԺn;;}}n**n]*]Üf*S];]]}SHv;;ܿnGa8;ܺS*ЧfS;ffIp<*I_*˟h*_IpǙhUˤ<<ԹIUx<<*I*IxxI*hTi0~[R)tGt{:ٷRR{G:ɮ)\d:l)dķRG:):)G\:Gɷ:\::ټɮGldRR{)G::ld9FrZkֹF9yyʾZyF(Z9(ֵyycڵ99(99Χ(kw^dddddddddddddddYL6fGG:\{:RݷG\):RGG)ټݼ::::):\ݼRRɳdG::ټ))))RR:l:{:\:):H:Sm\Ə:eHH:޹::)۽ƥ)޹::)ϥS:\*lkkkkkkkkkkkkkkkdWCgf]HHSH;;;H;;*ܿ*Ê;;;H*;;S***;];;ܿ]ٱ*]ܿܶ*;;****)];;͗~^~ċ;~^*;;*H;;H;*Ͳ;;;;;;*Tv^;6ussssssssssssssrnaL u̡ff};f;S;;;H;;*ܿ}SH;;f;;;Sn;;ܿ]*S]HSf*S}<LþȑLs>{>bȗL>LڹWLsWLs{LLȗL>͗W[j{b4f*}l}b+3_d8;SnvvS*nڭdnfCvͼtttt{x\_zMssYxdddVVVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOVVVdddiiiwww|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wwwiiiпп̧];Sȡ}S]]]]SSSSfvfHS}**ȷyA.ffAp׷pOA.\·pO.\Ÿyyױ..\pO.\\OO..ȷyA.fٷG\{t\)ٳ:lG:G:.OȑA.Ÿ.\͑O.f«\y͉..A‰Ayןyf.\.AOOOf.yAfy.OټGGѮ{ędGG:G:טA\Ayܥ\AןO.AOץ\fܟAA..fҘOAטAܿHHÊ}*]v;б*HS*Hб*HS*H];]]}SHvбn;SȬ*ffҘAAܥyAҘA.‰pܫp\AAO\‰.ҟ\OҘAܿHHvH࿐}Ȗ;ȖH}fHȖH}fHH];H̺;]u)]ȿS;}nfҘAA\ܫf.ҘA.͘Oyp.\AO\OAAȑOȉҘOOҘAټR))dll:d:\G::\G::\ݼRRɳdGl)ݼRG{ҘAp.ȫOfAOҘA.Ҙ\O׷\Ap.AAAȘ\\Ay¥p\ҘAټR{ٳGGRRRRG{RGG:RGG:::ݼR))):\ռ{R){ѷG)dҘAyA..Ap.OOҘA.͑O.ן\AOO\.AAfApO.\yAOҘAܿHHȜf*;Sn*n;;n*n;;;;SnSHáH]טAp.p\ҘA.‰ܥ\OfAOAAA.OOAטAܿHH}*Sv**ЧnSöSHЧnSöSH;;HnȺf]кfn}ͫyAȟ.Ҙ\O½ץp.A.yp\pfAfͫyץp..pןAOf.\ͫyARRĔęRtG)d{lGRtG)d{lGR::\R\{ݼ\)\ݷG:AA͑A\Ҙ\Aҟ\ҘOAOOf.pҟ\AҘO.OAAAiiiwww|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wwwiiiȺd)tٳ){t\RR\l\GRt{ҫO.fܱf\\fffffff\Oyffffffffff\\y\Op\ffffffff\Ofܱf\\fffffff\Oy׷pOA.\p\ffffffff\Ofp\ffffffff\OfҫOyĔ\ltR\ݷG::{əG::AppA͑.pyyyyyyppOOfyyyyppOOf.A.\yyyyyppy͑.pyyyyyypp͑O.f«\yA.\yyyyyppyA.\yyyyyppyypȟyH;;*S*nSS;;OAґ.A.fAAґ.ܥ\AAAAA.pyA]]Ȝ*]]*]Hn]*]f*;n;*fٺn;SfHn;*HжHSvбn;S;;ܿn;;nffOAґ.AO\AAґ.yAAAAAAyշlټ::)ݷRlGlضRR{G:l\\)ɮ\)d:Gt\lټG:{{dt)[ļ::t)lldץO͑.AApAOfyȑO.AO\͑.AAp..AO\.AO\ҘO\ɮlGGټ:::ݷGtѩtݷG\):ټlķ{:::G:Rl\Ď:Ĥ)l)::{Rdҫ.f\.·pAAȘ\yy\.AOyyyyҘOA̶;]ܿH;*;Ð};;;ܿ**;;;;;̖}]}Ê;̱;;;;ٿ}S*}SSܱfy\‚AAfAץy\OOץץܥOyȐS;ܺܺ];;Ԭv*;;;ܺ;*};;v*f࿊;HHHSH;Hv;}͘yAAןOA.OyAAp\yyfOҘzsɳt:\ɟRRGݷGG{ɮd:ݷ:::tRRd:)G){ػ:ݷG:tlGtd\::\{p׷Oܽf.yץp.ןAyA׷Oץp.Ҙ\O½yAyAf.\ȑAAAARRd)d{G:ٷG:R:)lݷG::ռ{Gѳt:GټG{RGltG{\{::R)ݷG:\A͑.OApҟ\Ҙ.͑.Oҟ\Ҙ\A..OAp..piiiwww|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wwwiiit\R\\RRRR\\{;Hf];]Ժ;;H*};;::RldGdRğ::)Rշl:ęd)\l{dd:)ij:dG{tG:)ٷR)l\\)RRldH*nS*}];;*ܿÐSHܿnȺ}HS;*v̬;]SHHH;*࿊HHܿ**;;;::ͩtGݼR:{d:{:)ͩtGGٷ:)::d)t))\G)tѮttR:){;;f*]nH}бSHnܿn*ٿ}HH;H;iiiwww||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wwwiii̧fS]]]]SSSSS]fv̧]HHnSnжHHnٿ}S**;]ܺ;f}}vn;*fܺ;**̡*]}S]v**]nHHټ{:ټRݷ::ٷݼR)ټədټtݷ::ٷtݼR)d{RGtęd)\ljx::ٷR)ͮ))lݼd):{R{ĩ)ddܿH;ܿSìHS;;n;f}H*];H̺;]SSȿnfÖSSÖnԿ};;ܺSnS;}nfܿH;ܿ;Сn*n;;}Sfç;SSS̶fHHSÐS;n;};H];HfSH}ټt)Gټ:\R:ѷtG\)tݼR))):\::ծ)\ټR)))))dݷ:ѷG)dټğldټ:ٷRGդ\G)ݼRl:)\)R\GR:\ݷ:G\ܿfnHSܿ;Ա}Hȡ}vSvȱ**vHnȺ;*ٶȖ*];кfn}Ð*HÐHv;HÖ]vS;f]SH;v**vж;SH]*]H;iiiwww||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||wwwiiiķd)t{ğ{R\\\\RRRRR\d{ğtGlȖ]nvS];;H]vvfSvÖ]SԺH;;;HHȜ*]Sç};n*ܺ}};*}\\ͮ))l\)\:\\l::{R)GGRռ{R))R{\:\t:)dd\)ęd)R\:\{G)ĩ)ddd)Ѯt{RdGټ\ԶllѼz::{{\{G\GR{G:l{RtGGͤ)Rl)dd)lGRd)\\R{{\{:)G:l{RtR:{ldծ):tٷGld:\)l[)\l:dͳl::d:dG{ɤR):ټɟ\G̱nHH;H];fH;]SHHHÐS;HHS;ܺ࿊;]Hf࿄;fH;*HHÐS;SH}ܺ}H;*}ܺHH}ç}Ь*v;;n;}бܺHSf}п;*ܿ࿄}̶;]S*****f}]*;;*H;;SH;;HHHH࿐}ܿ*̡;;;*ܿ;}]*;;*H;*;;HHԺH*fܿ;;*};*n}H;;̜**H;࿄ñvf;;ܿܶ};ĎR::\ճ{ĎRG::ݼRG::GGGG\:ٷݼ:::)ټ:ճ{ĎRG:)::GGG\ٷ{:){ݼGdݷ::d{ٷ:ݷ::Ĕ::Gݷ::ټGRl)ټݼ{{tɳt:\Ĕ)\ѩtR:::GR{::GGRd:ldGtɷt:d:::)ټ:ѩtR::)::GGͷdl{թ:ͩt\dݷGlշ\tݷ::\Rռݷ::ټ:dG)ٷͤdGSSж;Sn;v};];;}SS;;ÐSSS;Svб]**f;;H;ܿHn;v};]H;;;ÐSS]*]H;SHáv;nHHH*v}HHH;á;nH;ܿ*̧vSff*;ܿ*f}H;;Ê;nͷݳ))ͼппԿȱԿɤ\:Rğ{R\\\\RRRRdt\:GdGR{))ټ:G){))RtGlĤR):dd:)tGltGlĤR):dd:)tGltGlĤR):dd:)tGltGlɟG)Rtll{R))GtGlɟG)Rtd:){::G:Gɤ)G:ټ:G)ğt\{ĤR):d{R))GtGltGlĤR):dٷG\{t\)dGtlٳ:lG:G::{l\)Rɤldlճ:Gķt:\R:Rɤldlɤldlճ:Gķt:\R:Rɤldlɤldlճ:Gķt:\R:Rɤldlɤldll{::{:lļ{{{dt{R))ɤldll{::R:R:)R\:{dGճ:Gķt:\{dt{R))ɤldlɤldlճ:Gķt:\ܿHHԱ}ЧnȜfHH;H;ÊH*ÖS]Ȑ;*f̡n;ÐS]Ч*fСvSH*f̡n;*f̡n;ÐS]Ч*fСvSH*f̡n;*f̡n;ÐS]Ч*fСvSH*f̡n;*f̡n;;*ٶ;HÐ}*f̡n;;*СvSHS;ȖH*ÊH*fSÐS]Ч*fÐ}*f̡n;*f̡n;ÐS]Ч*fܿHHÊ;;ܺS*S;}*]v;б*HS*Hб*HS*H];]]}SHvбn;SȬ*ff]Sб**ņfȜfSܶ;n̡ÐSH;;]Ö]HHHܶ;n̡ܶ;n̡ÐSH;;]Ö]HHHܶ;n̡ܶ;n̡ÐSH;;]Ö]HHHܶ;n̡ܶ;n̡ÐSf*Ա}Ԭnܶ;n̡ÐSf*Ö]HHHH******SÐ]S]Sٺn;HSH;;]ffԬnܶ;n̡ܶ;n̡H;;]ټGGtGldRRGGd\:dݼ{Ĕ:ĔG{dGĔG{dGG\:Gɷ:\t)\ļR:{ldͼd)dlѼ{:::GRGټݼGRɤd\:)tG:GGͩt:ټݼGRټݼGRɤd\:)tG:GGͩt:ټݼGRټݼGRɤd\:)tG:GGͩt:ټݼGRټݼGRɤd\t\)GGltd)R{{\lټݼGRɤd\t\)GGGͩt:ɮ)\d))dɤdͼd)dl\\)GR:)tG:ld{\lټݼGRټݼGR:)tG:ټR))dR:l:{Rdt\ll:d:\G::\G::\ݼRRɳdGl)ݼRG{G):G\:ټd):tټݷG::)tGGG:ټݷG:ټݷG::)tGGG:ټݷG:ټݷG::)tGGG:ټݷG:ټݷG:Ĥ\\\:)RGR:ɩl\d\G)GtټݷG:Ĥ\\\:)GG:RGG)G)ټlķ{l\\R:l:)tGɩl\d\G)GtټݷG:ټݷG::)tGܿS}ٱ*]ܿ;;*SܶHHSSSSH}SHH;SHH;;;S***;]ؾ}S*}ԺH*f;*S*****fHHS*ȖܺHn;]H;HHÐS;ȖܺHnȖܺHn;]H;HHÐS;ȖܺHnȖܺHn;]H;HHÐS;ȖܺHnȖܺHnv;*H*ÐS;Զ]ȖܺHnv;*HHÐS;H;;*;*ܿ**;ܿf;;]H;Զ]ȖܺHnȖܺHn;]H;ܿHH]*S]HS]*}*nȜf*;Sn*n;;n*n;;;;SnSHáH];*;]];H;]H࿊f*n*}Ա}*;n]H࿊]H࿊f*n*}Ա}*;n]H࿊]H࿊f*n*}Ա}*;n]H࿊]H࿊ຄԱ}ȖSHS;}]H࿊ຄԱ}*;nH;;*;*ܺS;f*n*}S;}]H࿊]H࿊f*n*}ټGGճټdĩt{)Rt))ͤlRRGͤlRRG::Glķd\ͷdl{:)Ĕ)\:\l::ռt::ͮ{d{GlGͳR::ռt::::ռt::ͮ{d{GlGͳR::ռt::::ռt::ͮ{d{GlGͳR::ռt::::ռt::ͮ{Ѽͷt:RdRͳd\\l::ռt::ͮ{Ѽͷt:RlGͳRٷG::)ͮ:)tRĮ:\d{G{\l::ռt::::ռt::d{GRRt))tl\ĔęRtG)d{lGRtG)d{lGR::\R\{ݼ\)\ݷG:G:ͳ:Rͮ\)dd))dټ)ğtͮR:td))dd))dټ)ğtͮR:td))dd))dټ)ğtͮR:td))dd))dټ)R:ɤGG{ݷ:\d))dټ)R:ͮR:tݼ\GG::)G:ռ{G:G{ğtݷG:ݷ:\d))dd))dğt~~~kkk]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]kkk~~~yyyxxx͵i```q|||iii^^^iii|||д<U˟_<I<_*hԴ_<~ûulԯxIǍ<<*Iphx_h˾~yhU˯IIp_U_*<_Ǚ**<<<<WL>LdddĥڽaWf׼åddd{{{þ{{{xxx׽xxxּ׼wn˲D>DC7͏ܯޜ^ުKۤ>ۣ=٠;֜9Ӗ8ϐ8ˉ7͒TX<=+Ə=ƏKƕV`==ƏKƏ=ƕVƏ=+Ə=ʏK+KrƕV`Ə=+=rK=+ʛ`=Ə=+V=ϕ=V+==Ə=+==KƏKƏ=++==V+=K+==Ӳ=+=+===ƏK+ƕVj==lll[:GRRR:ddGlԻzR)z::dGlGG::ػGܶ:R)))))dkkklll[:GRRR:d::ܶG::):):)Rs[:::ȣlGsG:GGRG̣lGȲGdsdlkkkc:?Ā@V7g5龏ͧ܎^ۘIؓ@֏=֐;Ґ9Ό8Ȇ7~5LQ8ϡV+Ə=ƏK=zzK==Ə=Ə=+Ə=+=`=K=ƏK=zzKƏ=+V=Kz+ʕKzƏ=+=`ʕV`rVj=`+==Ə=+===Ə=Ə=++===`+`++===VϕK++==Kjr=+Kzԫ)H||S;n|SH;;n|HH;)ܾ;ߺ;;]ԫ)H||S;;;ߺHH;)H;;)ص;H));;]H|;f;Sԫ;))u])l>Ň6z?jA|;ϔ֣ߘ`߳QܪJۦG٢D֞Bә@ˍ=ņ<†KR;_hǹpp*>ȑ>>k{c@s4a8}U֗TÄۍ]omiiݡgٞc֙aҐ]ь^pr+KVV+=ȍ-ۭdwfL̄_҈_ybfuev{¹ҷ׽wwwlllaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaabbbbbbkkkwwwwwwlllaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaabbbbbbkkkwww S),RSއs 4 4applmntrRGB XYZ  $acspAPPL-appl#KB|}_)VrXYZ,gXYZ@bXYZTwtpthchad|,rTRCgTRCbTRCvcgtndin>desc ,ddscm Jmmod (cprt -XYZ h < XYZ kgY%XYZ #dqXYZ Rsf32 B&lcurvcurvcurvvcgt !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !#%')+-/0235689:<=>?ABCDEGHIJKLMNOPQRSTUVVWXYZ[\\]^_`aabcdeefghiijkllmnoopqrrstuuvwxxyzz{|}}~ndin63W P' OP T9@@ "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e* #,4<CJQZblv.CXo"Eh 8iMI`EI  x [ N M Z v D5>m3^?#  !"#$%&()*0+K,h-./1273s457C89;&Th|Þūǵɹ˷ͭϝшlL%ڿ܀83_iI3fj3>g{desc Color LCDmluc enUS(deDE:Color LCDFarb-LCDmmod itextCopyright Apple Computer, Inc., 2005./README.rtfd/Pasted Graphic 3.tiff0000644000076500007650000502103210335400320016266 0ustar hnshns00000000000000MM*4FF Fvvv<<<<<SOc]c^c]b\RO<>6:N a [8ʁ?ܛFLNNKښFʂ?[9s% HH;;*};;Q@Au%*$$FE?8%ދg,i ;H^v;;;Hͻ;^IJ*gڻH]Чn;HvÖHv};ܺSn;;v*nY*+A;QHcZoixpyqtke\SIB;)*Zz0{+"*BPWWOA+!~+{0;;ܶ;];;SS̶fHHSHS;ܱvS;]};SHf;;}Sfn=?1*UKh]vn}~xni_UK1)p=?V=́'4BRcjkdTB6Є'V>;;̧nHvH;S***;];ЧnH̶HfufnHHSHߺ;SS{{)$`Yxo|~yoaZ(${{{{ATaoyzrbUA{{;;]HSn;Ԭ;**v]*};f;S;;Hv;}87VQ|}ZR76h/ߨ=_r}~sa=i0;)ܺSHHnǺܺ;H|HHЧnfܺ]ȱ**v;;;].)piwo1,u#ۻPwyU{#;HصS]SuH)Ö]ԫ;;|Ǧ|HnߺH;;S)UP`Xʈߟ⤚͊d]XQ{CBgjEE_[NFNFb^P55Qzzzlklffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzzzzlklfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflklzzzwwwvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvwww|||{{{|||{{{rrrrrrrrrrrrfffffffffffffffffffff̾̾fffssssssfffffffffֺJJq޿UJU+fff```]]][[[[[[]]]```fffeeeffffffҦ+`V`==VV==Jfff^^^iiiiii^^^fffkkkGGGGGGffffff==ܬ+====fffZZZZZZfffoooGGGGGGGGGGGGffffff‰z==W+W++W=js=+W++zƐKWW===fffkkkYYYYYYkkkfffzzzHHHHHHHHHHHHHHHHHHffffffs=jK=s¸W{s+j̳j+sa==aajjss===fffiiiYYYYYYiiifffHHHHHHHHHHHHHHHHHHHHHHHHffffffWkLL͗W>Ñȑڴs,sb>㾊ѝb>>>fffYYYYYYfffkkkA@@@AAA@A@@@@@@@@@ffffffȯoD77DDϳ'|˦7oXDo'XvOX7DONN7`77|ӯ7|fffYYYnnnnnnYYYffffffBBBABBBBBBBBffffffϟY88~EEӲ~ַ~E(өq((iˤ(ExxP888~ײ8~fffZZZ^^^aaaaaa^^^ZZZYYYyyyfffbbbCCBCCBffffffyrP99FFcFrƴr9cZrү9PFյZ99ٵ9fffggggggppp[[[}}}fff```ffffff[s::RRͭ[))ḍ)GGl{))st)G::ܶGfffppp\\\}}}ffffffffffffppp^^^ffffffffffffffffffffffffrrrrrrrrrrrrrrrfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrrrrrffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrrr__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::f&.az"^ ˤIUpUpxJJUUUUUUUU__hh_U_ekn%I>>>ڹWLsb[j{b4b+3_d8nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhh__][Z__XZ_Y_]]Y\_HHrmmmm&&y*A::Ϳf&.az"^ h*x*xUUxqUxh+xekn%˙_pxU_IJh++<<̙_qxU_U!*Piy*v?K==II<<*<L㾊WbW{L,͝bߴ>>ѯLsL>>W,WW{L,WLs{L{L,ڹWLs͗>s[j{b4b+3_d8nfDwx\b}Ntt[zhhhYYYQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQYYYhhh8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ui8u8u8u8uHHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8uT`8u8uH{8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`8u8u8u8uHHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ui8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8H|Hu8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uݷ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH8u8u``u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|T|8uٳ8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uTTu8u8u8u8u8u8u8u8usiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|8u8u``u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8uԳ8u8u8u8u8u8usHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8{8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`Tu8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uTTu8u8uH|8u8u8u8u8u8u8u8u8u8u8u8uݼ88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u88us8u`i8u88u8u8u8u8u8u8u8u88uЮ8u88u``u`8u88`u8u8u8u8u8|8uH`u88u8u8u8uƤ8u8|8u8u8u88`u8u8u8u8u8u8u8u8u8uT`uٳг8u8u8u8u8uTu8uгT`|8uH`u8u8u8u8uTu8u8ui8u8u8u8u`Tu8|8us8u8u8u88u8u8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|`8ݷ8|Ƥ8`s8ݷT|{`uHu8u8u8u8u8u8u8|8u8ݷ88i8ui`|Էiu``u`8u8TusHuT|`Tu8u8u8u88u8uԮ8ݷ8u88u8u8|8u8u8u8TusHu8u8u8uTԼT{8u8u8uƳiƳiTu8u8us8uٳ8u`iu8u8u8u{8TԼT{TT|`iuݼ8uT|{`u8u8u8u{88u8uH8u8u8u8u`{8Hu8u8us8u8u8u8uHuԷiuTu8u8u8u8u8uݼ`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`Hu8u8u8u8u8u`Hu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88uٳ8u88uٳH``u8u88uٳiu``u8u8us|{u88uٳ8u8u8ٳ8u8u8u8uT`u``u`8u8i8u88u8u8u8uT`u8|ݷ88uٳ8u8|8u8uЩ8u8u8u8i8u8u8u8u`u8u8u8u8u8u8u8u8u8u8uٳ8u8u8u8uٳHu8u8u8u8u8u`u8u8u88u``u8uiu8u8u8u8u8uٳ8uH|8u8u8u8u8u``u88uT8uTu8u8u8u8u``u8u8uT`u8u8u8u8u8uTu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ٷ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiƳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiu8u8u8u8u8uiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u8uٷ8u88uٳ`i|``u8u88uٳHu``u8u8uЮ88uٳ8u8|8ٷ8u8u8u8u``u``u`8u8|8u{8uHƤ8u8u8u8|888uٳ8u8u8u8u8u8|8u8u8u88u{8u8u8u`u8u8u8u8u8u8u8u8u8u8uٳ8u8u8u8uٳ8u8u8u8u8u`u8u8u88u``u8`uHu8u8u8u8uٳ8u`su8u8u8u8u8u``u8s8u8uTu8u8u8u``u8u8u``u8u8u8u8u8uݷ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uƼ8uƼ8u8u8Գ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u8u8u8u8u8u8u8u8u8u8uTu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`u8u8u8u8u8u`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|H|8u8u88uٳ8Է8u8|Hu``u8u88uٳT8u88u`iu8u8u8u8u8u8uTu8u8u88uٳ8|{8u8u`u8i8u``u``u`iu``u8Hs8uݷ8u8u8u8|8u8u8uT|88uٳ8uT8u8u8u88u8u8u8``u88u8u8uT8ui8uݷH8u8u8u8u8usu8uH8uٳ8u8u8u8uٳ8u8u8u8u8u88T8ui88u``u8u8uT8u88u8u8u888uٳ8u8˩88u8u8u8u``u88u8us8uTiu8u8u8u`iu8u8u``usu8uH8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Ԯ8uT8u8u8u8u8u8u`8u8u8u8u8u8u8uT8u8u8u8u8uT8u8u8u8u8u8`8u8u8u8|ٳ8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8uHT|8u8u8u8u8uTHu8u8u8u8u8uTT|8u8uTu8uT8u8u8u`u8u8u8u8u8u8u8u8u8u8u8uTT|8u8u8u8u8uTHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Ю88uٳ8us``u8u88uٳ8u`u88u8u8u8u8u8u8u8u`8uٳ8Ʈ8uHЮ8u``u``uHiu`8u8u8u8u8uHԳ88uٳ8u8u8u8u8u8u8iu8u8u8u8u`u8u8u8u8u8u8u8uԳ8u8u``uԳ8u8˩8u8u8u8u8u`u`uЮ``u8u{8u8u`u8u8u8u`uԳ8u8u8u8u8u8u``u8`ˮ8u8u8u8u88u``u8u8u8u8u8u8uԳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u{8u8uiu8u8u`u88u8u8u8u8u8u8u8u8u8u8u8u8u8uˮ8u8us`uiu8u`u8u`u8uT8uT8u8uˮ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHT|8u8u8u8u8u8u8u8u8u`Hu8u8u8u8u8u8u8u8u8u8u8u8u8u8`8u8u8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`Tu8u8u8u8u`T|8u8u8u8u8u8u8u8u8u8u8u8|`8u8u8u8uH`8u8u8u8|`8u8u8u8u8u8u8u8u8u`T|8u8u8u8u8u8u8u8u8|`s8u8u8|8u8u8u8u8u8u8u8uH`8u8u8u8u8u8u8uH`8u8u8uTTu8u8u8u8u8u8u8u8u8u8u8u8u8uT`8u8u8u8u8u8u8u8u8u8|`8u8u8u8uT{u8u8u8u8u8u8uT8u8u`8u8uH`8u8u8uTHu8u8u8u8u8u8u8u8u8u8u8`8u8u8u8u8u8uT8u8u`8u8u8u8u8u8u8u8uH`8u8u8u8u8u8u8u8u8u8u8u8u8u8|T|8uTHu8uT`8u8u8u8u8u8u8u`8u8u8u8u8u8u8u8u8uT`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHu`88uTsiu8us|˩8u8ui|8u8u8u8u8u8u8u8u8u8uu8u8u{u8|{8u`Hu˩8u`u8u`u8u`Գ8u8u8|{8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`u8u8u8u88u8u8u8u`u8u8u8u8Գ8`u8|Ԯ8u8uT8uiƩ8uԳ8u8usu8u88u8u8u8u8u8u8u8u8Գ8u`u8u`u8u`Գ8u˼`u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Ԯ8u8u8u8u8u8u8uTu8u8Գ8`u8Գ8u8uЮ8uHu8u8u8u8us8u|8u8u8u8uTu8u8Գ8u`u8u`u8uTԳ8u88u8us8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Գ8u8u8uu8u8u8u8u8u8u8u8u`u8u8Գ88u8u8u8u8u8Ю8u8u8u8u8u8u8u8u8u88u8u8u8u8u8us8u8u8u8u8u`u8u8Գ8u`u8uTu8u{Գ8u8u8uH8u8u8us8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Hu8u8u8u8us|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|iHu8u8u8u8u`T|8u8u8u8u8u8u8u8u8u8u8u8u8u8uTiHu8u8u8uHi8u8u8u8u8u8u8u8u8u8u8u8u8u8|`Hu8u8u8u8uHi8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8us|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t#iWFKKWF#i7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHuT|8Գ8u8u8uTi{|8u8u8u8u`u8u8Գ8u{{Hu8{Hu8u8u8u8u8u8u8u8u8u8u`8u8u8u8i8uT{Tu`u8u8Գ8u`u8uƷԳ8ui|8i8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`iu8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`8uT8u8u8u8u8uTԳ8u8u8u`u8u{u8u8u8u8uTԳ8u8u8u8uiu8u8u8u8u8|8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8uH|Hu8u8u8u8u8u8u8u8u8u8u8uH|Hu8u88u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8uH8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|Hu8u8u8u8u8u8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7tbj n}gΈΈ}g nbj7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiusݷ8Ю8u8u8u8u{8u8u8u8u`u8u8Գ8u8u`u8u8u8u8u8u8u8u8u8u8u8u8u8u`u8u8u88u8u{`u`u8u8Գ8u`u8uHЮ8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHuT`u8u8uH|8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8us8u8uԳ8uHuH8ui|8u8u8u8uHٳ8u8u{{u8uT8u88uЮ8u8u8u8uHٳ8u8uii|8uHu88u8u8u8u8u8|8u8u8u8u8u8u8u8ui8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|8|8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8uٳ8u8|8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8ui`|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t&k$spp$s&k7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8iHu8u8u8u8u8u8u8u8u8u8u8ui`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8i`8u8u8u8uTi8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uTi8u8u8u8u8u8|i`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiT|8u8u8u8u8uHiT|8u8u8u8uTi8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8`u8u88u8`u8`u8u8u8u8u8u88u88uTsu8u8u8uT8u8u8u8u8u8uٳ8u8u8|i8u8u8з8|8u8u8u8u8u8uٳ8u8u8u8u8uTu``u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiu8u`8uԳ8uT`u8u8u8uT8uٷH`u8u8u8u8u``u`8u8u8u8u8u8`us8u8u8u8u8u8uTu8u8u8u88us8u8u8u8u88г8u8u8u8u8u8u8u8u8uԳ˩8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t6raBP#azddzaP#aB6r7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Hu8uT|`u{8_|{`uTusHuTusHu8u8u8u8u8u88u8uƤ8us8u8u8uHu8u8u8u8u8u8uٳ8u8uHu8u8u8u8u8u8u8u8uٳ8u8u8u8u8|8uH|8uiu8u8u8u8u8u8u8u8u8u8u8u8u8u8uTٷ8u8|H|Huݷ8u``u8u8u8uT8uٷ8u`|8uԮ8u8u8u8|`{H|H|HuԷiuԷiuTu8ui`|s8|Ƥ8{8u8u8u8|`TH8u8u8u8|`8ݷ8|Ƥ88u8u8u88ݷTT|Tu8uƳiԷiuTu8|`8u8u8uiiu8ٳ8uiusiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t5obMa t5y5z5t5^ Mb5o7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8uƤ8uT`u8u8|88uiui8ui8u8u8u8u8u8u88u8u8u8u{u8u8u8u8u8u8u8uٳ8u8uHuH88u8u8u8u8u8uٳ8u8u8u8Hu8u8uTu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`u8u`u8uTiuݷ8u``u8u8u8u8usԳ8uٳ8u8|ݷ8u8u8u`8u8u`u8uTiu8uT`u8uT`u8ٳ8u8u8u8uH8u8|8u8u8u8uٳ8uHu8u8u8u8u8uٳ8u88uٳH8u8u8u888uٳ88u8u8u8u8uT`u8uٳ8u8u8u8u8|{8uٳ8u8`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t4m!i;iv}j;!i4m7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8us88uT`u8u8|88uHu8u{8u{8u8u8u8u8u88u8u8us{`u8uiu8u8u8u8u8u8u8u8uٳ8u8uٳ8u8s8u8u8u8u8u8u8u8uٳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`{u8uTiuݷ8uT`u8u8u8uԳ8uٳ8u88u8u8u`8u8u`{u8uTiu8u``u8u``u8ٷ8u8u8u8u`i|8u8|8u8u8u8uٷ8u8u8u8u8u8u8uٷ8u88uٳ`i|8u8u8u888uٳ88u8u8u8u8u``u8uٷ8u8u8u8u8uԮ8uٳ8`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t4l+o;Jz~H+o;4l7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`u`u88uT8u88u``u8``u88u8u8u8u8u88u8uH|8u8u8u`H`8u8|8u8u8uݷ8u8uHu8ssu8u8|8u8u8uݷ8u8uT`8u8uH|8u8˩8u8u8u8u8u8uHs|8u8u8u8u8u8u8u8Ƥ8uTu8u`u8u8u8uݼ8uٳ8uٳ8u8u8u8uT|8u8u8u88uTTƤ8uTu8u``u8u``usu8uH8u`u8i8u8Է8u8|Hu`u8u8u8u8u8u`8u8u8u8u8u8u88uٳ8Է8u8|Hu8u8u8u888uٳ88usu8uH8u8u8u8u``usu8uH8u8u8u8u8u8uT{u8uٳ`iu{`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t4m3qqX%X3qq4m7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`ˮ`uT88u8u`uiuiu8u8u8u8uг8u`u8u8ٳ8u`8u8|8u88ٳ8u`8u`u8u8u8u8u8`u`8u8u8u8u8u8u8u8u8u{`u8u8u8uԳ8u8uHԳ8u8u8u8us8u8u``u8u``u8u8uHЮ``usT8u8u8u8u8usu8u8u8u8u88uٳ8us8u8u8u888uٳ8uЮ8u8u8u8u8u``u8u8u8u8u8u8u8u8u8uԳ88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t5o/dDQzHtV}EQ/d5o7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uiHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|T|8uTHu8u8|`8u8u8u8u8u`8u8u8u8u8u8u8u8u8u8`8u8u8uH`8u8u8uH`8u8u8u8u8u8u8u8u8u8u8u8u8u`s8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uii8u8u8u8u`s8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|ii8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|`Hu8u8u8uH`8u8u8u8u8u8u8uHHu8u`8u8u8u8u8u8u8u`T|8u8u8u8u8u8u8|`Hu8u8u8|`Hu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT`8u8u8u8u`T|8u8u8|`8u8u8u`Hu8u8u8u`8u8u8u8u8u8u8u8uHT|8u8uH`8u8u8u8u8u8u8uHT|8u8u8u8u8u8u8u8u8u`Hu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uTHu8u8uT`8u8u8u8u8u8u8u8u8u8u8u8u8u8uT`8u8u8uHT|8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8T|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7s3l-_Gf[2w*{8^2Gf-_3l7s8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8usiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8ˮ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t6r3k/b+[*X*X+[/b3k6r7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ٷ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t6r5o3l2j2j3l5o6r7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8usu8u8u8uTT|8u8u8u8u8u8u8uT8u8u8u8u8u8u8uiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u7t7t7s7s7t7t8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u8Լ8u8uiu8u8u8u8u8u`u8u8uiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ui8u8u8u8uHHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8uT`8u8uH{8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Գ8u8u8u˩8u8us8u8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8H|Hu8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`8u`ٷ8u8u8Գ8u8uHu8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|T|8uٳ8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uTTu8u8u8u8u8u8u8u8usiu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH|8u8u``u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uT8u8uԳ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`8u`ˮ8uTu8u8Գ8u8u8u8u8u8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u88us8u`i8u88u8u8u8u8u8u8u8u88uЮ8u88u``u`8u88`u8u8u8u8u8|8uH`u88u8u8u8uƤ8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Գ8u`Գ8u8u8u8u8u`u8u8Գ8u8u8u8u8uTг8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|`8ݷ8|Ƥ8`s8ݷT|{`uHu8u8u8u8u8u8u8|8u8ݷ88i8ui`|Էiu``u`8u8TusHuT|`Tu8u8u8u88u8uԮ8ݷ8u88u8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8ui8u`u8u8Գ8usii8u8u`u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88uٳ8u88uٳH``u8u88uٳiu``u8u8us|{u88uٳ8u8u8ٳ8u8u8u8uT`u``u`8u8i8u88u8u8u8uT`u8|ݷ88uٳ8u8|8u8uЩ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Ю8u`u8u8Գ8uƳ8u8u8ٷ8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|8u8u8uٷ8u88uٳ`i|``u8u88uٳHu``u8u8uЮ88uٳ8u8|8ٷ8u8u8u8u``u``u`8u8|8u{8uHƤ8u8u8u8|888uٳ8u8u8u8u8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHu8u8uTiHu8u8u8u8u8u8u8u8u8u8u8uTs{Tu8u8u8uHu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88|H|8u8u88uٳ8Է8u8|Hu``u8u88uٳT8u88u`iu8u8u8u8u8u8uTu8u8u88uٳ8|{8u8u`u8i8u``u``u`iu``u8Hs8uݷ8u8u8u8|8u8u8uT|88uٳ8uT8u8u8u8Hs|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8|iu8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8su8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8Ю88uٳ8us``u8u88uٳ8u`u88u8u8u8u8u8u8u8u`8uٳ8Ʈ8uHЮ8u``u``uHiu`8u8u8u8u8uHԳ88uٳ8u8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uHT|8u8u8u8u8u8u8u8u8u`Hu8u8u8u8u8u8u8u8u8u8u8u8u8u8`8u8u8u8u`8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u`Tu8u8u8u8u`T|8u8u8u8u8u8u8u8u8u8u8u8|`8u8u8u8uH`8u8u8u8|`8u8u8u8u8u8u8u8u8u`T|8u8u8u8u8u8u8u8u8|`s8u8u8|8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u88u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8uH8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u8u׽âTTaaTTâͥ\O\O\f\ff\\\\fpץ.͉ҟy͉.͉A.yyp~~vggӈӈggv~~\\f.AOpy\AAͱ.Oґ‘.ґ.ґ͑A.AAґ..ğzpp묬묬ppzğ.AAAfAґAAO.fpןAfץAAfpOґ..׫O\ץpAfyO,s\ןffȟpOOҘff.fpAOypO.pAOypO.ͥpOןAOypAAf\͑A.‰O巂Oױ\ҟ\......\OO##__tt]]]]tt__##OOҘO\\f.p.A\AAҘO\\..\fAff̟.\yAO͑ҘpґOp\fpҘO.y͑A.A\O͉AAAOpOpןfp.ҘOױ.ག͑A..ܥApp.A.yt00000000tppyyA\yAApy.p׽p.yOf\.AAOpґґҘApҘfט͑A.ґA.͑A.A.fO͉AAAAAAApAyy\ґAAґ͑A.\ApҘO\טAAOґA.{{ȑܥfAOpO.A.O͘ҘAfן\O.\ґґґ͑yґ͑A.͑A.͑A.pfO͉AAAAAAAґOAґAAґ͑A.ȉ.yAAґApҘA.AO͑A.FFFFfAO\\\ApAAAfҟ.AAҘOOןOfpyґґґ.ȑAO͑A.͉.͑A.͉.A.y͉AOAAAAטOґAA͉͑A.p.͑fAOAO͑A. .O\AAAAA͑ҘAA͑OOҘOOґ.ґ.ґ.ཉfґAAץOґAAOAfOOpfOAOAOȟpAґ.OAf\ґAAyOOfAOґA..aaFFggggRRaaҟ\O͘fAAAApOApAA‚Apyy<<))))<DC7͏ܯޜ^ުKۤ>ۣ=٠;֜9Ӗ8ϐ8ˉ7͒TX<=+Ə=ƏKƕV`==ƏKƏ=ƕVƏ=+Ə=ʏK+KrƕV`Ə=+=rK=+ʛ`=Ə=+V=ϕ=V+==Ə=+==KƏKƏ=++==V+=K+==Ӳ=+=+===ƏK+ƕVj==lll[:GRRR:ddGlԻzR)z::жG)dGG::ػGܶ:R)))))dkkk̬ɩ̬ս̬ؽc:?Ā@V7g5龏ͧ܎^ۘIؓ@֏=֐;Ґ9Ό8Ȇ7~5LQ8ϡV+Ə=ƏK=zzK==Ə=Ə=+Ə=+=`=K=ƏK=zzKƏ=+V=Kz+ʕKzƏ=+=`ʕV`rVj=`+==Ə=+===Ə=Ə=++===`+`++===VϕK++==Kjr=+Kzԫ)H||S;n|SH;;áH]HH;)ܾ;ߺ;;]έέȪȦ˪l>Ň6z?jA|;ϔ֣ߘ`߳QܪJۦG٢D֞Bә@ˍ=ņ<†KR;_hǹpp*desc ,ddscm Jmmod (cprt -XYZ h < XYZ kgY%XYZ #dqXYZ Rsf32 B&lcurvcurvcurvvcgt !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !#%')+-/0235689:<=>?ABCDEGHIJKLMNOPQRSTUVVWXYZ[\\]^_`aabcdeefghiijkllmnoopqrrstuuvwxxyzz{|}}~ndin63W P' OP T9@@ "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e* #,4<CJQZblv.CXo"Eh 8iMI`EI  x [ N M Z v D5>m3^?#  !"#$%&()*0+K,h-./1273s457C89;&Th|Þūǵɹ˷ͭϝшlL%ڿ܀83_iI3fj3>g{desc Color LCDmluc enUS(deDE:Color LCDFarb-LCDmmod itextCopyright Apple Computer, Inc., 2005./README.rtfd/pastedGraphic.tiff0000644000076500007650000154116210331471331016160 0ustar hnshns00000000000000MM* as p p p p o p p o op p o k p q p p s o n n m m n n jn o p o n o o n j m n n n m m n n n m l n m m l k q o l l m m m n m m m m m m m m m m n m n o m l kp oqr r n r pqss nnqsrtw t sy{{{{{y{{ z{{ y z {   ! $&$ $ ' '$!$% $$$#$%'$(+,*)%+,+(+,,,*/11//00.02-1-302 42442123332521224648=;:;978;?9;<:>>>===9;>??>>@C@ACDACD?ABEFADADDDFEEEIKIGJIIIJJIIKJHHEGHHHJKKKJKOMJLKKKJJLKKLMNNLMMOONJMOQOKPQ OKN{SpVnSoK~KOOMMPNNNMMRrTnTmOqHHMNMOMONOOOuRkUgVfVgVeVeVfVfVfVeVfVfUeUeUeUfUe UfShOnL MMMKN' -Q e sn pnpsqqsqsrqqrqp q ppq qoqv q q qq tqsq q q qp psrttonpqs qs qoo q lop q q rr qqq qqqq q qst qruqr wt qrrstuxyyyyy}y||yzy|~ !  !!"$ !$  """%#""#'')(' -+(((*-*(--*,.,.,,./3011/25434522687347576788889:;<99<:=<<;??A@>=>>?@B@AAFFCDCGEDHGFGJGFIIIHHHNLKKIOPMMLOOMQRQPPSQPQPRVSPQSRRSSSUWWXWUUZXVWX[\YZZYY[ZZ[YYY][WZ`] [\\[[\\\c+zOlytc1~ a \^]`_\]n=`vzjPn^]_a`__h,xHZgiiihhiihhiiihihidS?n_[^`0 9c a p n mp qq qqqq qq q qoos qps urq qq qqqqm prp o p qqnr r q qqnsvqqs qq qqppq q qq q q q qqq q q q qqsts p q qvvvw wtwvwxyw vzy yyxz{~~y      " !!"  $#"!# #!"""$'$(+(''(&)()-+)-*-+-+,+./0004110001225365167878578778:8<=<;:?>>:><<@<=?@@CA@@BBBBDEBEGGHHEEGHFGKIGGHIIHHJMKNMLMMNPNNOOPPPPPPSRQPSTSTUUUTWXVVVVVVWTUWWYZZX[[ZZXXX[]\Y\[[\][\_\oRxqn___ ^a:i< _]`^^"rXqztvvvwwvvvvruvvvvvwxk< c__/ 7b aqp okhghjo qqpmhhi oq qp moijonq pkeq qssq q ppijpp qpqrpqtqqq poq qqqqqo pq qqq q r o qtuursqtsu ruvww vxyxxzxzy{ y{zy} #!""!"#%&$#!# &&%(&''&&&$')+,**(*(()+-///,+///-00110/000545575456557:8:<;9<?==<>???<>?<??>A@@@@DCBA@DGHDCHFHIIHHHKKIKIHIKHKMJKMLNOOLLNMOQPMLOTQSRPQQRSTSSTTVWUWWTWYXWWWWVXYYZYXXXXY\]]\[YY[^] \ Yn[}~o]]_><;??>?@C?A@ABDEBABCGDEEGGGGJJJJGFJHKIIJILKMMMLOPNOOQQSQOQOQQSVSSSPQSUUTTVVVWXWXWWXXYYWWXX][XY[[[[[Y\]ZXZ[Z[`M@N]!)4 (%+7BMZe["rurs$v\b^GXs0:L,7GThc|IZsTi@Rgywa3 7b b tqi*7ks}(: q q m(7 ppnkZd*;mk mki o${ qln p qppqqq oosqp qqq rrq qq qpqqqqqsrstrqru suvutwvwxy uuxyy{|x}  # "# "$"#'('&)*'$')&'((')(*(,//--*.////01/03652343357343858:9:9878:998<89::;=<?B@?@@@@CG@@DBDFEDFDBEGGGHHGKHHLMJLLIJJOOKNKNOMPOPPRUURTQTTUUTSVTTTQTUTUVVWWVW[ZXZXXXXWYXXZ[\\ZZ[\_\[!\!]_ZojGHG"&Wjyo%*0@GR%p\I-25bx9EQ=EPW _,z;FV-5@hy[l%*Uf|[k.8BYm"'/bvZl0 9b dq ni-<bq^l'~(3c6D oqp(3 tp q p%/=v#4;K&|9M;Lr { t:F2C oqr sqsqpq q mop q qqq q q q qqqq p pss pqsprwt rss stuxyyyyz}y|{yzy|  !  "#$ ! $ !!"#%"!!$$'+((,+(((*,+(.-*+.,.++./3011002434423687467774778899:;=:9<<=><;?>@>>=>?A@A@A@FECCDGGEHGDFJGFIIIHFHLJJKINONMLOOMPRPPPPPPQPTVSPPSTRRSUTVWWWUUZYWWWY[Y[Z[Z\[[[YXW\[XZ_]Z\\Y[7~q17@^t1:C3:@/hV\k}%-5lES`6>JW(/5nt0 ;b ` o ndFU'IWdop osUcBP p rq(5 npqi7H'y{bs msvpqtq q qqqqq q qqq qqqqqq qq pptvs or qvvwxvuxvvxyw uzxyxx z}{y    !"#!" !&#"!#"""##$''%(*''&'')''-*)**-++,/+./000411000011545415767777866898<=;<9??>;?==?;=?A?B@@BADBBFFCDGGHIGEGHGGKIGHHJJHJKLJLKKMLNNNNOOPOOPPPTPPQSRTVTUVTVWVVUUVWWUUWVWYZY[ZZZYWY[]\ZZ[[]_ [[O}n~%*0!%+SugUdy#,29)u}cmz4:B*/4o|4;E)| 0 9b aqqipkftN^mppeiqp j)4 nlqh6D,)anmoqqqqtqqq ppq qqqqqo pq qpp qr o rs turtqttu qtvwx vxxxxyyzz{ y|{y| ! !#! !#&$#!# %&%(&''&&&$'),,+*(*((*+-0//,+0///00110000054557646755898:;99<>==<>???;>?;??>A@@@@CCCB@BGGDBGFHIIHHHKKHKIIIKIKMHJLLNOOLMNMOQOMLORQTRQRQQSSSSSTVVUWWUXXXWWWYWWYYZZYXYXX\\\\\ZY[]\^V %)NZbWxpaq-3:*uou:=C+/2w%)+QW[#'*w,~ 3 8b apqjYi,=$~jhjxxp ot=L/:rq n&6 mnoi5G4Ev*}):qpqpoqpqq q rurqqqq p pq qqnpqp q qrprquqtwv ssyvwxxwxw v wyxy}|}   """## "'&$'' ()%$%&')('''*(()/+/.+-.00////113020044246637799;85:8778;;;<;;=<=;???@@C@B@BABEBACCDDEDGGGGJIJJGHKIKIIJIMLNKMLOPMOOPPTSPRPQRSVSTTQRRUUTSUWWWXWWXYYXZYWWXX\[WX\\\[[X[^ZXZ\Z[C~6kijz)07n|CLSCHOil.03lrw>CG~@EFz259#w 3 :b d u pj5Dk mqo$4)zf); p p m&4 kifg6E?@KNORUVl/ 9a dp mh;Kp psqogw1>orq)4noq"{7D>;;>>@====?A@A@C@EECCCEGGHGDFJGFIIIGEGKIIJINNNMLONMPQPOPPPPQPTVROPTTRRSUTVWWWUUYYWWVYYY\[[Z\\[ZXXX\\Y[^]\[\XYbpv'++ofZ7Wduju^bd0~^ jlnlgif}>d- 8a ` o nfo}-9q ppppq6H0@sp qp-/Afv*:jz-Aw$y n_jHW rupqtq qq qqqqqqqq qqqqqq qq pptxu orqvuwxutyuuxyw uzxyxy z}yy    #"# " !&##"#""$#$'''%(('%&'(*''-*)(*,-+-/,,-/00313102021545425556787966:;8<=;=9???=>?=>;=?B@A@@CADABFGEBEHHHHGFGFGKIHHIJKHKLLJKKKMLNMNOOOPONPPPRPPQRRTTTSVTVXVVUTUWXUTWVWYYXZYYYYWZ[]\ZYZ[] _\]Z)x'v]\ ac[a]ZCm_1 6a bpq qmj korq q p p mjjj m q rp mokjiekmljp mospk hqkkpmj oppqqrqqq ppq qqq qpnpq q ppqq p rtrt ru q sst prwyx xyxyyyy{zz y}}{|   !$ !"#&$!!$ & '&'&'''%&%'++++*(+()(,-1//,+1////.100000053537446767998;:89<>><>>???:=?;???B@@A@CDCB@BFGEDGEHIJJIKKJHJIIHJIKLHKMMNOOMMONOROOMOSQUSPRRQSSTSSTVUUWXVYXWXWWYWXZY[\XWXXY[\\\\ZXZ\\^\ Z2}(x__^\ fjYd`_\ ^Bq__2 5a aqqqqq onr qqqqs opq qqs qqq ppppo p q q p o ppon n npqpqsqqqpqpqp psuq qqqq q pq q qnpqp qq qprrsqtw w tuyuxwyvxvuwyxy{|}    """#$!!%&$'( ))&$%'&(('')**()/,./*-/00/00.02511005334662769:;88:878999;;;:<<>;?@@?@C?@AD@AEBBECDDECGGGGJIJJGHLJKKJJHMNOKMLOPMOOQPTTQSQSRSVTTSSRRUTTVUVWWXWWXXYXZYWWWX[ZWX\]\[[Y\^ZX[\[\\_] jYOi]^___[ _3&{_]^^__ ] pQ1 e`_a3 6a d t p qopr qqrqrqpp r rp pq qppnpvqp p qtqrppppp pr qrro o ppq q r q no r mopqq rs qqq qqqq qq ru qrurr usprsstvxyyyxw{yz|||x~! "$ "$ %#"$''##'((&' -)'&''+((+--...,,+.0 300/0167346236753376788;:879::;8;:9<;<<??C@@???@@D@ABEFEFCGDDGGGGIHGIIIIJJNNKLJOOLNKNOMPQPPQRSPTPQVSRRRTSTTRUVVUVTVYWWXXY[YYZXW[XY[ZZZ[ZY\_^\]]]\\]^\ Z boul ^ Z]^]\`^]_^^ kts f^`^__a____] c f f g f f f f g fd f f g f f g g f e f^^_ []`0 7a c p m nn orppqpp qpo pnp p pr uqp qs pop p pqrp o o oon srr r om ru qpr pq po oop p ppp p p ooppp p opqqr p p qvvuv u tvuxxxwwy{ xzyxy}z}   ! ! !  " "" ! !!#! "'#',(')('(()-+(.***-+-+-./00210002112437724787737767898;=<;;>==:;<=@==???A@@@AADBCCCEGFGGDFIHFGIIGFGIIHIILNNMLMMNPPOOPPPPPPSVRPPVSSSUUTVWXUUUWWVWUWXX[[[Y\\\ZXXWZ\[Y]\[[\Y[^\\\]]Z[^^]\___`__aa_^_^[\^^\_`__]`^\_``^````^[[^^_`aa^^]____^_/ 7a b q o l p q qq qq q qq qqq qsq qqop qq qqq q q lrs q q q ps qq qqqqnruqquq qq qqq qqqqqqqqqqq qr o ptxv prqvuwwuuyuuyyv uzxyxz {}yz    $" " #"$&$#$##!%$%(''''(&%&))+(),**(+,--./-,///03122/3001554545457777:87;<8<=<>:>??>>?>===?B@AA@EBDABEGGDCHHHIHGGGHLJHIJKMIKMLKLLLNMNLNNOQPONPQPTPPQRRTTSSVTVXWVVTUXXVVWWWXZYZYYYZXZ\]\[ZZ[]!_\\\\^_]^^_a_\^__^_^^]``^^__`_b_^`]]_____^`_^^^^_]]^[]^``_____`b`_2 5aߣ:FXaGS_`߽GS_`߽GS_`߽GS_`߽GS_`߽GS_`߽GS_`GS_`(18 &+"'-%* i{-5h{08@ | ','-3vt#)/\hyyhwl{n~viyx~|rft{dszguft{wgvfuwftxfuxrix~sqgvhw~~~}|gntDP\]v{wjnj^_Z=GPCO[j}$#eu#(l}|^o#(fw%,2crw `o(/7}\hy|gvm}on}yzyhvywiyiwky{|jxo}yn}pk{tl|~|gntDO[\xzx}}}}{|{rusgkh\]Z}=HR r"'|n  +29'-5-5=6>GN\j06>3;D:CMj}x `o\hygvkyoqyiyjyjykzpm}l|~phvsk{um|gntDO[\lolkkiggebcadfdt!(.\hyjztkzyfukyjykzvm{zcrkyptk{rkygntDO[\~#)0M[i[hyshwgvgwugu{~_n|tapfuixgufuguiyft`p~o~gxixogvgvhx|dswo~gubqfvhxesgntDO[\~VaoogntDO[\XbpriotDO[\ZeqiouDO[\^gplpuDO[\rnk~chqnqwCNZ[FP,('"$"^scjrmrvCNZ[oALT^_jGR,'#.:enunsxCNZ[ITdo-&.8pP]kN[iNYgZixP\jJWdk}ctap^m~csMZgO\jfvjquSRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRSRRS\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\]\\][[[\aeCNZ[CKl{?F)!bu%+109@3;DGhz #5>F%-3q(05i|!(.YhxCNZ[Q]+n}BI)! {&,2lu DO[(/6 #{%*u+3:Vdro/6?~ =HSXgv!&!YhwJVc(/6vv(06p Ucp -6<"CNZ[98)KRit-&  lv.7=_o>HQN[i #{%*HTaiz %+FR^4>FJVc.4<gz%+rp"'.o $%+2^n'-4uy ~#s$)~w#CNZ[IU()AGcmkvQ^1*("  k)/6O]k:DL>GP #} &,v%,3+2:!%/7?#8@ISao?IR3IR{n4=E"'x9DM-6>=HS+4<)09\k{duu?IU8AL4IS7BJ]l{&,2o8BK{GR_ $*6>HWgv3;CO[ihz!&>HS~#("z+2;#(%+s29C6>HP^lp>ISFwALWX 4iz@KVWfx EO[&-2]m~%*}p,5<$Xhv5>GVdsP^k{ wLWe!%*du"|"`p5>H j{@KVW %*gy '-  G$*/]n~9CMZjw"' #)/j{`p >HR[jy $ &*Xgw%*")-")-!&+ (/6gx@KVWy*08@KVW#'4=G'/68CK@KVWUdru@KVW?JUV?JUV?JUV?JUV?JUV?JUV?JUV?JUVlGS_IU`IUaIUaIUb?JUVev;FN=HQ>JR;CN ?ITU_pHUa?ITUXgtGT`u FS_ o@KTJXcYhw@KW8AJKXd 18A ?ITU\lz#sgy$*0@NYAKVKXd t:ENKXe HST>HST>HST>HST>HSTCNX?BBLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPLPPAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEEAEE=AA[`_>HST@IR>HST@JT>HST@JT=GRSO\jshx@JT=GRSHU`4?GDOXN\j@JT=GRSM[gHSUcr%+[k{ MZhp>JUqCNZ!'!%,@JT+++y}{dhf343'('XYXjlj000010=GRS") @LX,3;i{u(-4GR`:CNpw;&'&;;; 343-.-z}{=GRSl@KU?KV  q,4;!$*/7?IRIUb;FMO]k*18DNX m%){ &-y#(/AKVWgvIV`Ucr@JTDED¿787XXX &'&;<;///333tut444"$"NON=GRSN\i>JT! &-4AMW@IQKVcFi|!(}$)y"(/@JTGHGCDCSTSGGG'('-.-,-,222=GRSKYd:BLP`l!'-hz%+1DQ]O_i'/4o19AvGS]$*1;DNIVb =HS9BM!k{ #z#&w &+EP[fvAKT2:C@JTgigSTSILI!!!~~)+*>??JKJdfd<=?>ABAJKJkkkrtr?A@xyx¿ikiABAtvt\^\¾EFE<=<GPHQ?JSENZ!7?H 5>F@JT;FNfv@JTKKKehe!!!******JMKy{y/0/ÿ ]^]RSR343STS---NONKLKprq<=<;<;!#"oqoBCB;EOPM[g:ENsu*08 @JTKKKehenonFGFuwu/0/OOO`a`)))???LNM/0/===()(mpnACA;EOPXgv>GR")/ar ~u$+1iz @JTKKKdhehjh010 ///HIHtvt xzx///,,,454;EOPIR9BLMMZfQ\iUdrKXe n]o~9BLMzl~\lz||{{|zk~ i||z9BLMaq!$p  # [j{IS_.6?\l|CNY3=DZgw1:B ]n~"'$)wm  ")/ p(.5gz)189BLMbs.6>+29j|$+0O^k $KWd%) AMV?KU p3;D_peu7CK'/6x sAKVAOY9BLMi{ LZf@MYFR^FR_DO\ %,WhuVdqCNZ2ITEP[BMYJV@NW hxCO\;GO ALTGS`Vfu8AKLCNYAKVQ^lVcrALWIUaypM[fpoMYf9AKEP[w9AL5>GxoevKYdp9AK6>GMZgmuGR^8AKL8AKL8AKL8AKL8AKL7AJK7AJK7AJKQb^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^p^pUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgUgK^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^HXx7AJK@NcV]e7AJK@NcW[a7AJKBPdW]b7AJKHRcX]c7AJKKUeX^b6@IJMXfjy[h{?HTBLZ:DPALYGQ_EPELX;CL mz,19#&+ PZi DKVGNZ*09gv4:DPXf.19+07qY_b6@IJNXfIR_28A$(.8?GuMVdw}$( yV`nal~T^m(-4LUcV_n4;DPYf8?H!'`l~ #'}Q[j16@lz&+1Y_b6@IJNXfIR_28Ay &9@JPYgt?GQR\kx#'GOZ&,4(.58@Idp9AKS]j18BP[h.5< m|p"&,ISaCLX GQ] "'.y9@J$7>GJS`29A`iz2:C  5=F cp+09  3:B|U`p bpY_b6@IJNXfIR_28AU`o@JU#]hyHQ]x#'FNY?HR  $*itS\j18BW`o  GO\r"&,]hz p$(ENZFNZOZgS_mCJVU_o P[h "$*S\kDLX;BL v#'."'-39@}V`p bmY_b6@IJNXfIR`17@$6ILUd=EO@HTAKTBJU"%T_nPZi39B2:BMVcWbq16?}V`q grY_b6@IJNXf[gw+08S]mp~\gw$)17?DNYyyyuw"'uYdtn|15>_j{/5=48A:@JAIU5:C49B49B16>zPYg7GRu*/6%*0V`pt*-339Bn|(-4:AKXcsW`p"%Y_b6?HIPYe59B]guDLWDISY_b6?HIR[g;?IBGOY^c6?HIV^gZ_c6?HIY`hZ`d6?HI[bh[`c6?HI_elZ\^6?HIw6?HIy^n|`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`q`qYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwYhwWfsp5>GH5>GH5>GH5>GH5>GHUf}M]tN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vN_vHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnFUhpuIYnGWnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnHXnFVlRbv5>GHRczkyyydz`m}5>GH:JfV_gP`sY\c5>GHBPkYblVfx[_f4=FGHVkYclXgx\`f4=FGOXlZclZhx^`f4=FGQ]nZbl\iy_bf4=FGT_n[cl\jy_cf4=FGU_nkyjxrq[cl\jysqtqtv_cf4=FGU_nWcr*/6',4',3'-4:AJFQ"%+!& %"&,fs05=kxIR^ T\k_cf4=FGU_n ht$)0qR\jo} 5:CHS OYh_cf3FOIQ^[cl\jy+.6rn{!U`p]gw"t`l|KSa 6=Fy$(-.4<(/3kv(.5lx &#'-r|#(-z%(/07@er/6=jw*/6jxDLXENZ_cf3eq/4;hs.3:htBKVGP]_cf3EPft|/3<',3nz&,2"'t%)/am~48Ckx o}FdpkxEQiv y%+/05>dp/3;fsy),4x!$*_cf3GqmzS]l%*0CJV8@JBJW'+2_jz NWf3;Ds)187F=GR Xgvz~09AB_:xQ>gyvwtBibFx9[pHx8O){CFu=?DwzLO[nPtigpV66xSm״dzlmp!%(&$rZc` MfNew:DM )/6|Ves\ly$)~~19B~09AB_:z@l^ywr?f :bvh /MzI{8O)lx}vBH>>J<94uLNhXgrgkqAy&ЕVhv~exv!%DED@B@WVW999('$rZc` MfN"'s.8@~GU`hz#',!',09AB_:xAefyt?d*lxk)CxI{8O)==>zFH:9 D('%,+*|MLulenc~_{s#^5:7y"OakPbn!%KKK(&$rZc` MfN $y %'.7P]lgxpIUa`p '+~08@A_:zDrUxDl1Opb 2RzI{8O)354p|BG<=A111666QirCNQVk}R@w$EaDjM^nH[kH[kN`oBt!8W!vUbYhu!%mqnEEE)*)(&$rZc` MfN $x(/5$-2tk}rbt #lrXgv08@A_:xU9Yu1M.I 5UCnIv{Jz8O)T[[>?9>>=DF@lrtOTUPWW{F?D<=%$H578 :=>[owQyO2b4TU{fR OsESfxPco!%NNN(&$rZc` MfN#w (-*14nnt*06 &,%+.6>08@A_:wn# br0I=ewM  bzI{8O)CGE///<<ITkJq $+/!%ÿ>?>000YZY('$rZc` MfN#'.3&-4BLY2;DdtoCOZFQ^@KW %~08@A_:vwCp-bqsvwIv 0OvwI{8O)ty}jpmmpn343--,x{y]^Zuz}j}) iI VH+~jxJt#Ns3S7_}n9JCm/H#(႗ $tut&%"rZc` MfN\iyLYdAKTbsKXcAMVBMWfOfwwUiyxI{7O)piw;K24Te/7?@Y1rrrrrrsstssstrrsrrsFt7O'vwssƠ/7?@}cCoCoCoCoCoCoCoCoCoCoCoCoCoCoCoCnCnCoDo&J3K!{|z|z|z|z|z|z|z|z|z|z|{}/7?@Av.N#$$$$$$$$$$$$$$$$$$#5ÐÐÐÐÐÐÐÑđđđđđđđĒŒŒŒŒŒŒŒŒŒƒƒƒƒƒƒƒƓǓǓǓǓǓǓǓǔȔȔȔȔȔȔȔȔȔɔɔɔɔɔɔɔɕʕʕʕʕʕʕʕʖ˖˖˖˖˖˖˖˗̗̗̗̗̗̗̗̗̗͗͗͗͗͗͗͗͘ΘΘΘΘΘΘΘΙϙϙϙϙϙϙϙϙϚККККККККњњњњњњњћқққққққҜӜӜӜӜӜӜӜӜӝԙԓԑԑԑԑԑԒՒՒՒՒՒՒՓ՜֞֞֞֞֞֞֞֞֟ןןןןןןןנؠؠؠؠؠؠؠؠ٠٠٠٠٠٠٠١ڡڡڡڡڡڡڡڡڢۣۢۢۢۢۢۢۢܣܣܣܣܣܣܣܣݣݣݣݣݣݣݣݣ)078 .RS6s 4> 4applmntrRGB XYZ  $acspAPPL-appl#KB|}_)VrXYZ,gXYZ@bXYZTwtpthchad|,rTRCgTRCbTRCvcgtndin>desc ,ddscm Jmmod (cprt -XYZ h < XYZ kgY%XYZ #dqXYZ Rsf32 B&lcurvcurvcurvvcgt !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !$')+-/135689;<>?ABDEFHIJKLMOPQRSTUVWXYZ[\\]^_`abcddefghiijklmmnopqqrstuuvwxyyz{||}~ !#%')+-/0235689:<=>?ABCDEGHIJKLMNOPQRSTUVVWXYZ[\\]^_`aabcdeefghiijkllmnoopqrrstuuvwxxyzz{|}}~ndin63W P' OP T9@@ "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e "&*/4:?EKRY`gnv~,AVm8ZJw ?u!^'p bu >  i \ ] n%^Tq-v@lM1 !!"#$%&'(*+,:-]./023:4n568!9e:;=J>?AYBDEFHaIKLLNGOQVRTyVWYW[\^d`ace_g(hjlnparGt1vx y{}Ӂ̃Ʌˇщߋ2]Ǚ>z*d٭Lö>|$R|Ǡ ߹LWwf)y">ML=t"e* #,4<CJQZblv.CXo"Eh 8iMI`EI  x [ N M Z v D5>m3^?#  !"#$%&()*0+K,h-./1273s457C89;&Th|Þūǵɹ˷ͭϝшlL%ڿ܀83_iI3fj3>g{desc Color LCDmluc enUS(deDE:Color LCDFarb-LCDmmod itextCopyright Apple Computer, Inc., 2005./README.rtfd/TXT.rtf0000644000076500007650000001016610335400320013710 0ustar hnshns00000000000000{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf230 {\fonttbl\f0\fnil\fcharset77 Geneva;\f1\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;\red255\green0\blue0;} \paperw11900\paperh16840\margl1440\margr1440\vieww14040\viewh10700\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\sa160\ql\qnatural\pardirnatural \f0\fs28 \cf0 README - Quick Installation Guide\ \ \fs32 1. Enable the Zaurus for TCP over USB\ \fs28 Open the Settings Tab and change the PC Link settings to look like this:\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \f1\fs24 \cf0 {{\NeXTGraphic pastedGraphic.tiff \width7660 \height5740 }}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \f0\fs28 \cf0 \ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\sa160\ql\qnatural\pardirnatural \fs32 \cf0 2. Install the AJZaurusUSB package\ \fs28 simply by double-clicking on the package and following the Installer instructions.\ NOTE: Please install on MacOS 10.4 (Tiger) only. \cf2 It does not work on 10.3 (Panther).\ \cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \fs32 \cf0 3. At the end of the installation process\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \fs28 \cf0 reboot the Mac (the Installer will ask you to do so).\ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\sa160\ql\qnatural\pardirnatural \cf0 After rebooting the Mac (or before, it doesn't really matter) connect the Zaurus to a free USB port and turn it on.\ Start the System Preferences application on the Mac and select "Network". You will be notified that a new Ethernet interface (typically called en2 or en3) is available. It should look similar to this:\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1\fs24 \cf0 {{\NeXTGraphic Pasted Graphic 1.tiff \width11900 \height11060 }}\ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \cf0 \ \f0\fs28 Select the new interface and Configure... This will show the TCP/IP settings similar to:\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1\fs24 \cf0 {{\NeXTGraphic Pasted Graphic 2.tiff \width11900 \height11060 }}\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f0\fs28 \cf0 \ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\sa160\ql\qnatural\pardirnatural \cf0 \ Configure the new interface with a manual IP address of "192.168.129.1" and click "Apply Now".\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \fs32 \cf0 4. Operation\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\sa160\ql\qnatural\pardirnatural \fs28 \cf0 If you plug in or switch on your Zaurus the network status should switch to green light. If you unplug it will change to a red light:\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1\fs24 \cf0 {{\NeXTGraphic Pasted Graphic 3.tiff \width11900 \height11060 }} \f0\fs28 \ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\sa160\ql\qnatural\pardirnatural \cf0 \ If you use a Powerbook that goes to Sleep mode, the driver may hang after awaking. In that case, please switch off/unplug the Zaurus, wait some seconds and switch on/plug in again.\ \fs32 5. Uninstall\ \fs28 delete \f1\fs24 /System/Library/Extensions/AJZaurusUSB.kext \f0\fs28 and reboot your Mac.\ \ }./WELCOME.rtf0000644000076500007650000000104610225777311012445 0ustar hnshns00000000000000{\rtf1\mac\ansicpg10000\cocoartf802 {\fonttbl\f0\fnil\fcharset77 Geneva;} {\colortbl;\red255\green255\blue255;} {\info}\paperw11900\paperh16840\margl1440\margr1440\vieww9000\viewh8400\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\fs28 \cf0 Welcome to the AJZaurus Installation Program. \ \ This installs an USB driver to the kernel so that your Sharp Zaurus can communicate with MacOS X.\ \ You will be guided through the steps necessary to install this software.\ }./fixbuild.sh0000755000076500007650000000103410276164533013001 0ustar hnshns00000000000000#!/bin/sh # # This script fixes the permissions of the driver so no warning message # is issued when it gets loaded (e.g. vie kextload). # sudo chown -R root pkg/AJZaurusUSB.kext sudo chgrp -R wheel pkg/AJZaurusUSB.kext sudo chmod -R go-w pkg/AJZaurusUSB.kext exit 0 # copy the plugins sudo mkdir pkg/AJZaurusUSB.kext/Contents/PlugIns sudo cp -pR AJZaurusUSBCommDummy/pkg/AJZaurusUSBCommDummy.kext pkg/AJZaurusUSB.kext/Contents/PlugIns sudo cp -pR AJZaurusUSBDataDummy/pkg/AJZaurusUSBDataDummy.kext pkg/AJZaurusUSB.kext/Contents/PlugIns ./HOWTO-MAKE0000644000076500007650000000430610531054014012161 0ustar hnshns00000000000000====================================== MAKE Handhelds-USB driver for Mac OS X ====================================== 0. About -------- This is an experimental driver (or technically speaking a "kernel extension") that allows Mac OS X to communicate with a Sharp Zaurus or other Handheld Devices over USB. 1. How to compile ----------------- - Select "Compile" as the Active Target. - press Build - this will open a Terminal window. - Type 'make' in that Terminal. - You will be asked for the root password since AJZaurusUSB must be compiled as root. NOTE: for testing if the code compiles, you can select the AJZaurusUSB target and simply Build. But it will fail with a 'permission denied' error when trying to create the package. 2. Testing ---------- For testing source code modifications, DON'T install the driver since it will confuse the kext loader and sometimes you will load the old one. If you already have, delete the folder "AJZaurusUSB.kext" located at "/System/Library/Extensions" and reboot. Or type make uninstall and reboot! To test a freshly built version, connect the USB device to your Mac and turn it on. Then type make load inside a terminal window to load the driver. Switching on the USB device should now initialize the driver. After you're finished, type make unload and afterwards turn off or disconnect the device. To see what's going on, you should have an open console window during testing or a terminal window executing "tail -f /var/log/system.log". 3. Creating an installer package -------------------------------- Type make pkg This will first build the driver and then load the file "AJZaurusUSB.pmproj" with the Package Maker application (included in Apple's developer tools). 1. Go to the "Package Version" tab and edit the version number 2. Choose "Build..." from the "Project" menu to create the installer package and save as "AJZaurusUSB.pkg" in the working directory. Note that it will complain a little about a missing file "AJZaurusUSB.jpg". This is the background image of the installer which is not included in the source code since it has a different license. Finally type make tgz to make a distribution package that contains everything. Updated: 22 Nov 2006./makefile0000644000076500007650000001150310542023022012315 0ustar hnshns00000000000000VERSION=0.5.0 .PHONY: all AJZaurusUSB tgz clean src pkg help check load unload install uninstall all: AJZaurusUSB patch-version-number: # here we should patch the version number in InfoPlist.strings, Info.plist, and AJZaurusUSB.pmproj (is a binary PList - root/$objects/53 = version number) AJZaurusUSB: patch-version-number @echo "Building AJZaurusUSB" (sudo rm -rf build pkg && mkdir pkg && xcodebuild -target AJZaurusUSB) sudo chown -R root pkg/AJZaurusUSB.kext sudo chgrp -R wheel pkg/AJZaurusUSB.kext sudo chmod -R go-w pkg/AJZaurusUSB.kext tgz: @echo "Packing AJZaurusUSB-$(VERSION).tgz" tar cvzf AJZaurusUSB-$(VERSION).tgz ./AJZaurusUSB.pkg ./COPYING ./WELCOME.rtf ./README.rtfd ./HISTORY.rtf clean: @echo "Cleaning AJZaurusUSB" sudo rm -rf build pkg sudo find . -name .DS_Store -exec rm {} \; src: clean @echo "Packing AJZaurusUSB-$(VERSION)-src.tgz" tar cvzf AJZaurusUSB-$(VERSION)-src.tgz \ ./COPYING ./*.rtf* \ ./fixbuild.sh \ ./HOWTO-MAKE ./makefile \ ./Sources \ ./*.plist \ ./*.xcode* ./*.lproj \ ./*.pmproj \ ./*.term \ ./*.gdb help: @echo "Makefile for making AJZaurusUSB" @echo "" @echo "Supported targets:" @echo "make all - build driver (asks for root password)" @echo "make check - check driver dependencies" @echo "make load - load driver" @echo "make unload - unload driver" @echo "make install - permanently install" @echo "make uninstall - permanently uninstall" @echo "make pkg - installer package" @echo "make src - source distribution" @echo "make tgz - full distribution file (incl. src)" load: @echo "Loading AJZaurusUSB" sudo kextload pkg/AJZaurusUSB.kext ld: # if we have access the package through a network only @echo "Loading AJZaurusUSB through /tmp" sudo rm -rf /tmp/AJZaurusUSB.kext cp -Rf pkg/AJZaurusUSB.kext /tmp/AJZaurusUSB.kext sudo chown -R root /tmp/AJZaurusUSB.kext sudo kextload /tmp/AJZaurusUSB.kext check: @echo "Checking AJZaurusUSB" sudo kextload -c -tn -v 3 pkg/AJZaurusUSB.kext unload: @echo "Unloading AJZaurusUSB" sudo kextunload pkg/AJZaurusUSB.kext install: # permanently install on your local machine @echo "Installing AJZaurusUSB" sudo sh -c "(cd pkg && tar cf - AJZaurusUSB.kext) | (cd /System/Library/Extensions && tar xvf -)" @echo "Loading AJZaurusUSB" sudo kextload /System/Library/Extensions/AJZaurusUSB.kext @echo "****************************************************" @echo "You should now reboot to load the driver permanently" @echo "****************************************************" uninstall: # uninstall existing driver @echo "Unloading AJZaurusUSB" - sudo kextunload /System/Library/Extensions/AJZaurusUSB.kext @echo "Uninstalling AJZaurusUSB" sudo rm -rf /System/Library/Extensions/AJZaurusUSB.kext @echo "****************************************************" @echo "You should now reboot to really uninstall the driver" @echo "****************************************************" pkg: AJZaurusUSB open AJZaurusUSB.pmproj # experimental - not working yet .PHONY: enable-kdb sudo copy2target loadremote getsymtab gdb # # remote debugging # please refer to http://developer.apple.com/documentation/Darwin/Conceptual/KEXTConcept/KEXTConceptDebugger/hello_debugger.html # # Bonjour name/address TARGET := powerbook.local # user on target machine USER := $(USER) ETHERNET := 00:03:93:07:23:a2 # architecture of target machine (ppc, intel) ARCH := ppc # sometimes ssh and/or sudo may execute the commands in a tcsh even if we expclicity have a /bin/bash enable-kdb: # enable kernel debugging on target machine ssh $(USER)@$(TARGET) sh -c 'sudo nvram boot-args="debug=0x14e"' sudo: @echo "*** reset sudo timeout ***" @echo "first password is for authentication of target ssh access, second one is for target sudo" ssh $(USER)@$(TARGET) sudo -v # update timestamp copy2target: @echo "*** copy kernel extension to target machine ***" @echo "next password is for authentication of target ssh access" (cd pkg && tar czpf - AJZaurusUSB.kext) | ssh $(USER)@$(TARGET) sh -c 'cd; cd /tmp && sudo rm -rf AJZaurusUSB.kext && tar xzf - && sudo chown -R root:wheel /tmp/AJZaurusUSB.kext' getsymtab: @echo "*** create symbol files, fetch from target ***" @echo "next password is for authentication of target ssh access" ssh $(USER)@$(TARGET) sh -c 'cd; cd /tmp && sudo kextload -lvs /tmp AJZaurusUSB.kext' @echo "next password is for authentication of target ssh access" ssh $(USER)@$(TARGET) sh -c 'cd; cd /tmp && tar czf - *.sym' | (cd pkg && tar xvzf - -m) loadremote: @echo "*** finally load/match driver on remote side ***" @echo "next password is for authentication of target ssh access" ssh $(USER)@$(TARGET) sudo /bin/bash -c 'cd; cd /tmp && kextload -m AJZaurusUSB.kext' prepare: sudo copy2target getsymtab loadremote gdb: gdb -arch $(ARCH) -x prepare.gdb /mach_kernel debug: sudo copy2target getsymtab loadremote gdb ./Sources/0000755000076500007650000000000010473771650012264 5ustar hnshns00000000000000./Sources/Client.cpp0000755000076500007650000010416110541761447014213 0ustar hnshns00000000000000/* File: Client.cpp This module implements the Client interface, i.e. the interface to the MacOS X IP Networking stack Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #include "Driver.h" #define numStats 13 UInt16 stats[13] = { kXMIT_OK_REQ, kRCV_OK_REQ, kXMIT_ERROR_REQ, kRCV_ERROR_REQ, kRCV_CRC_ERROR_REQ, kRCV_ERROR_ALIGNMENT_REQ, kXMIT_ONE_COLLISION_REQ, kXMIT_MORE_COLLISIONS_REQ, kXMIT_DEFERRED_REQ, kXMIT_MAX_COLLISION_REQ, kRCV_OVERRUN_REQ, kXMIT_TIMES_CARRIER_LOST_REQ, kXMIT_LATE_COLLISIONS_REQ }; /* a driver is matched and used with the following calling sequence . init() . attach() . probe() -> success or failure . detach() if choosen: . attach() . start() . open() . enable() any of: . outputPacket() . message() . timeoutOccurred() . wakeUp() . putToSleep() . terminate() . disable() . close() . message() . willTerminate() . didTerminate() . stop() . detach() <- failure . free() */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::init // // Inputs: properties - data (keys and values) used to match // // Outputs: Return code - true (init successful), false (init failed) // // Desc: Initialize the driver. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::init(OSDictionary *properties) { UInt32 i; #if USE_ELG g.evLogBufp = NULL; AllocateEventLog(kEvLogSize); // ALERT(&g, g.evLogBufp, 'USBM', "net_lucid_cake_driver_AJZaurusUSB::init - event logging set up."); waitForService(resourceMatching("kdp")); #endif /* USE_ELG */ IOLog("AJZaurusUSB(%p)::init\n", this); if(super::init(properties) == false) { IOLog("AJZaurusUSB::init - initialize super failed\n"); return false; } // Set some defaults fMax_Block_Size = MAX_BLOCK_SIZE; fCurrStat = 0; fStatInProgress = false; fDataDead = false; fCommDead = false; fPacketFilter = kPACKET_TYPE_DIRECTED | kPACKET_TYPE_BROADCAST | kPACKET_TYPE_MULTICAST; fPadded = true; // default to use padding (TODO: find out whether this is really necessary) fChecksum = true; for (i=0; iGetNumConfigurations(); if(configs < 1) { IOLog("AJZaurusUSB::start - no configurations\n"); stop(provider); return false; } // Now take control of the device and configure it if(!fpDevice->open(this)) { IOLog("AJZaurusUSB::start - unable to open device\n"); stop(provider); return false; } if(!configureDevice(configs)) { IOLog("AJZaurusUSB::start - configure Device failed\n"); fpDevice->close(this); fpDevice = NULL; stop(provider); return false; } if(!initForPM(provider)) { IOLog("AJZaurusUSB::start - initForPM failed\n"); stop(provider); return false; } #if 0 IOLog("AJZaurusUSB::start - register as power controller\n"); // initialize superclass variables from IOService.h fPowerState = kCDCPowerOnState; PMinit(); // join the tree from IOService.h provider->joinPMtree(this); // register as controlling driver from IOService.h if(registerPowerDriver( this, (IOPMPowerState *) ourPowerStates, kNumCDCStates ) != kIOReturnSuccess) { IOLog("AJZaurusUSB::start - failed to register as power controller\n"); } #endif IOLog("AJZaurusUSB::start - successful\n"); #if 0 // fail for debugging { IOLog("AJZaurusUSB::start - fails for debugging purposes\n"); fpDevice->close(this); fpDevice = NULL; stop(provider); return false; } #endif return true; }/* end start */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::open // // Inputs: // // Outputs: // // Desc: Open the driver. // /****************************************************************************************************/ #if 0 bool net_lucid_cake_driver_AJZaurusUSB::open() { } #endif /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::enable // // Inputs: netif - the interface being enabled // // Outputs: Return code - kIOReturnSuccess or kIOReturnIOError // // Desc: Called by IOEthernetInterface client to enable the controller. // This method is always called while running on the default workloop // thread // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::enable(IONetworkInterface *netif) { IONetworkMedium *medium; IOMediumType mediumType = kIOMediumEthernet10BaseT | kIOMediumOptionFullDuplex; IOLog("AJZaurusUSB::enable %p\n", netif); // If an interface client has previously enabled us, // and we know there can only be one interface client // for this driver, then simply return success. // FIXME: if we want to support multiple UBS over Ethernet devices (i.e. 2 Zaurusses on different USB ports) // we have to be more intelligent in manageing the state of all Network interfaces if (fNetifEnabled) { IOLog("AJZaurusUSB::enable - already enabled\n"); return kIOReturnSuccess; } if (!fReady && !wakeUp()) { IOLog("AJZaurusUSB::enable - wakeup failed\n"); return kIOReturnIOError; } // Mark the controller as enabled by the interface. fNetifEnabled = true; // Assume an active link (leave this in for now - until we know better) // Should probably use the values returned in the Network Connection notification // that is if we have an interrupt pipe, otherwise default to these fLinkStatus = 1; medium = IONetworkMedium::getMediumWithType(fMediumDict, mediumType); IOLog("AJZaurusUSB::enable - medium type=%lu and medium=%p\n", mediumType, medium); setLinkStatus(kIONetworkLinkActive | kIONetworkLinkValid, medium, 10 * 1000000); // this should switch the Network status to green IOLog("AJZaurusUSB::enable - LinkStatus set\n"); // Start our IOOutputQueue object. fTransmitQueue->setCapacity(TRANSMIT_QUEUE_SIZE); IOLog("AJZaurusUSB::enable - capacity set to %d\n", TRANSMIT_QUEUE_SIZE); fTransmitQueue->start(); IOLog("AJZaurusUSB::enable - transmit queue started\n"); USBSetPacketFilter(); IOLog("AJZaurusUSB::enable - packet filter applied\n"); return kIOReturnSuccess; }/* end enable */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::message // // Inputs: type - message type, provider - my provider, argument - additional parameters // // Outputs: return Code - kIOReturnSuccess // // Desc: Handles IOKit messages. // /****************************************************************************************************/ // FIXME: we should try to receive kIOMessageSystemHasPoweredOn IOReturn net_lucid_cake_driver_AJZaurusUSB::message(UInt32 type, IOService *provider, void *argument) { IOReturn ior; IOLog("AJZaurusUSB::message - type %lu/%08lx provider=%p argument=%p\n", type, type, provider, argument); if (!fpDevice) // no USB provider return kIOReturnUnsupported; switch (type) { // general messages case kIOMessageServiceIsTerminated: IOLog("AJZaurusUSB::message - kIOMessageServiceIsTerminated ready=%d type=%lu\n", fReady, type); if (fReady) { if (!fTerminate) // Check if we're already being terminated { IOLog("AJZaurusUSB::message - hardcoded message!\n"); // NOTE! This call below depends on the hard coded path of this KEXT. Make sure // that if the KEXT moves, this path is changed! KUNCUserNotificationDisplayNotice( 0, // Timeout in seconds 0, // Flags (for later usage) "", // iconPath (not supported yet) "", // soundPath (not supported yet) "", // localizationPath (AJ: removed hard coded path, rather not support it) "Unplug Header", // the header "Unplug Notice", // the notice - look in Localizable.strings "OK"); } } else { if (fCommInterface) { if (fCommInterface != fDataInterface) fCommInterface->close(this); fCommInterface->release(); fCommInterface = NULL; } if (fDataInterface) { fDataInterface->close(this); fDataInterface->release(); fDataInterface = NULL; } fpDevice->close(this); // need to close so we can get the free and stop calls, only if no sessions active (see putToSleep) fpDevice = NULL; } fTerminate = true; // we're being terminated (unplugged) return kIOReturnSuccess; case kIOMessageServiceIsSuspended: IOLog("AJZaurusUSB::message - kIOMessageServiceIsSuspended\n"); break; case kIOMessageServiceIsResumed: IOLog("AJZaurusUSB::message - kIOMessageServiceIsResumed\n"); break; case kIOMessageServiceIsRequestingClose: IOLog("AJZaurusUSB::message - kIOMessageServiceIsRequestingClose\n"); break; case kIOMessageServiceIsAttemptingOpen: IOLog("AJZaurusUSB::message - kIOMessageServiceAttemptingOpen\n"); break; case kIOMessageServiceWasClosed: IOLog("AJZaurusUSB::message - kIOMessageServiceWasClosed\n"); break; case kIOMessageServiceBusyStateChange: IOLog("AJZaurusUSB::message - kIOMessageServiceBusyStateChange\n"); break; case kIOMessageServicePropertyChange: IOLog("AJZaurusUSB::message - kIOMessageServicePropertyChange\n"); break; // USB messages case kIOUSBMessagePortHasBeenResumed: IOLog("AJZaurusUSB::message - kIOUSBMessagePortHasBeenResumed\n"); // If the reads are dead try and resurrect them if (fCommDead) { ior = fCommPipe->Read(fCommPipeMDP, 5000, // 5 seconds until timeout 5000, fCommPipeMDP->getLength(), &fCommCompletionInfo, NULL); // ior = fCommPipe->Read(fCommPipeMDP, , NULL); if (ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::message - Failed to queue Comm pipe read: %d\n", ior); } else { fCommDead = false; } } // and again... if (fDataDead) { ior = fInPipe->Read(fPipeInMDP, 5000, // 5 seconds until timeout 5000, fPipeInMDP->getLength(), &fReadCompletionInfo, NULL); // ior = fInPipe->Read(fPipeInMDP, &fReadCompletionInfo, NULL); if (ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::message - Failed to queue Data pipe read: %d\n", ior); } else { fDataDead = false; } } return kIOReturnSuccess; case kIOUSBMessageHubResumePort: IOLog("AJZaurusUSB::message - kIOUSBMessageHubResumePort\n"); break; // power case kIOMessageDeviceHasPoweredOn: IOLog("AJZaurusUSB::message - kIOMessageDeviceHasPoweredOn\n"); break; case kIOMessageSystemWillSleep: IOLog("AJZaurusUSB::message - kIOMessageSystemWillSleep\n"); break; case kIOMessageSystemHasPoweredOn: IOLog("AJZaurusUSB::message - kIOMessageSystemHasPoweredOn\n"); break; // any other default: IOLog("AJZaurusUSB::message - unknown message\n"); break; } return kIOReturnUnsupported; }/* end message */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::outputPacket // // Inputs: mbuf - the packet // param - optional parameter // // Outputs: Return code - kIOReturnOutputSuccess or kIOReturnOutputStall // // Desc: Packet transmission. The BSD mbuf needs to be formatted correctly // and transmitted // /****************************************************************************************************/ UInt32 net_lucid_cake_driver_AJZaurusUSB::outputPacket(mbuf_t pkt, void *param) { UInt32 ret = kIOReturnOutputSuccess; #if 0 IOLog("AJZaurusUSB::outputPacket(%p)\n", pkt); #endif if(!fLinkStatus) { IOLog("AJZaurusUSB::outputPacket(%p) - link is down (%d)\n", pkt, fLinkStatus); if(fOutputErrsOK) fpNetStats->outputErrors++; freePacket(pkt); } else if(!USBTransmitPacket(pkt)) { // wasn't able to transmit ret = kIOReturnOutputStall; // ret = kIOReturnOutputDropped; IOLog("AJZaurusUSB::outputPacket(%p) - packet dropped\n", pkt); // If the driver returns kIOReturnDropped, it should also put the mbuf_t back into the network stack // s common pool by invoking the superclasss freePacket function. freePacket(pkt); } return ret; }/* end outputPacket */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::timeoutOccurred // // Inputs: // // Outputs: // // Desc: Timeout handler, used for stats gathering. // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::timeoutOccurred(IOTimerEventSource *timer) { UInt16 currStat; IOReturn rc; IOUSBDevRequest *STREQ; bool statOk = false; // IOLog("AJZaurusUSB::timeoutOccurred\n"); if (fReady) fTransmitQueue->service(IOBasicOutputQueue::kServiceAsync); // AJ: revive a stalled queue (according to Apple's documentation, this call doesn't do any harm, even if the queue wasn't stalled). else IOLog("AJZaurusUSB::timeoutOccurred - Spurious\n"); if ((fEthernetStatistics[0]|fEthernetStatistics[1]|fEthernetStatistics[2]|fEthernetStatistics[3]) == 0) { // no bit is set // IOLog("AJZaurusUSB::timeoutOccurred - No Ethernet statistics defined\n"); fTimerSource->setTimeoutMS(WATCHDOG_TIMER_MS); // AJ: set up the watchdog again return; } // Only get statistics it if it's not already in progress if (!fStatInProgress) { // Check if the stat we're currently interested in is supported currStat = stats[fCurrStat++]; if (fCurrStat >= numStats) fCurrStat = 0; switch(currStat) { case kXMIT_OK_REQ: if (fEthernetStatistics[0] & kXMIT_OK) statOk = true; break; case kRCV_OK_REQ: if (fEthernetStatistics[0] & kRCV_OK) statOk = true; break; case kXMIT_ERROR_REQ: if (fEthernetStatistics[0] & kXMIT_ERROR_REQ) statOk = true; break; case kRCV_ERROR_REQ: if (fEthernetStatistics[0] & kRCV_ERROR_REQ) statOk = true; break; case kRCV_CRC_ERROR_REQ: if (fEthernetStatistics[2] & kRCV_CRC_ERROR) statOk = true; break; case kRCV_ERROR_ALIGNMENT_REQ: if (fEthernetStatistics[2] & kRCV_ERROR_ALIGNMENT) statOk = true; break; case kXMIT_ONE_COLLISION_REQ: if (fEthernetStatistics[2] & kXMIT_ONE_COLLISION) statOk = true; break; case kXMIT_MORE_COLLISIONS_REQ: if (fEthernetStatistics[2] & kXMIT_MORE_COLLISIONS) statOk = true; break; case kXMIT_DEFERRED_REQ: if (fEthernetStatistics[2] & kXMIT_DEFERRED) statOk = true; break; case kXMIT_MAX_COLLISION_REQ: if (fEthernetStatistics[2] & kXMIT_MAX_COLLISION) statOk = true; break; case kRCV_OVERRUN_REQ: if (fEthernetStatistics[3] & kRCV_OVERRUN) statOk = true; break; case kXMIT_TIMES_CARRIER_LOST_REQ: if (fEthernetStatistics[3] & kXMIT_TIMES_CARRIER_LOST) statOk = true; break; case kXMIT_LATE_COLLISIONS_REQ: if (fEthernetStatistics[3] & kXMIT_LATE_COLLISIONS) statOk = true; break; default: break; } } if (statOk) { STREQ = (IOUSBDevRequest*)IOMalloc(sizeof(IOUSBDevRequest)); if (!STREQ) IOLog("AJZaurusUSB::timeoutOccurred - allocate STREQ failed\n"); else { bzero(STREQ, sizeof(IOUSBDevRequest)); // Now build the Statistics Request STREQ->bmRequestType = USBmakebmRequestType(kUSBOut, kUSBClass, kUSBInterface); STREQ->bRequest = kGet_Ethernet_Statistics; STREQ->wValue = currStat; STREQ->wIndex = fCommInterfaceNumber; STREQ->wLength = 4; STREQ->pData = &fStatValue; fStatsCompletionInfo.parameter = STREQ; rc = fpDevice->DeviceRequest(STREQ, &fStatsCompletionInfo); if (rc != kIOReturnSuccess) { IOLog("AJZaurusUSB::timeoutOccurred - Error issueing DeviceRequest for %d: %d\n", STREQ->bRequest, rc); IOFree(STREQ, sizeof(IOUSBDevRequest)); } else fStatInProgress = true; } } // IOLog("AJZaurusUSB::timeoutOccurred - Ethernet statistics done\n"); // Restart the watchdog timer fTimerSource->setTimeoutMS(WATCHDOG_TIMER_MS); }/* end timeoutOccurred */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::wakeUp // // Inputs: // // Outputs: Return Code - true(we're awake), false(failed) // // Desc: Resumes the device it it was suspended and then gets all the data // structures sorted out and all the pipes ready. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::wakeUp() { IOReturn rtn = kIOReturnSuccess; IOLog("AJZaurusUSB::wakeUp\n"); fReady = false; if (fTimerSource) fTimerSource->cancelTimeout(); // cancel any running timer setLinkStatus(0, 0); // Initialize the link state //if (fbmAttributes & kUSBAtrBusPowered) //{ // rtn = fpDevice->SuspendDevice(false); // Resume the device // if (rtn != kIOReturnSuccess) // { // ALERT(0, 0, 'wkS-', "net_lucid_cake_driver_AJZaurusUSB::wakeUp - error waking device"); // return false; // } //} // //IOSleep(50); // // AJ: The above is commented out because it's an endless source of // trouble (at least with the Zaurus, probably also with other // PDAs) - on Panther, it can even cause the USB subsystem to hang! // Not trying to suspend/wake up the Zaurus at all seems to be just // fine (it won't suspend anyway upon SuspendDevice(true)). if (!allocateResources()) { return false; } // Read the comm interrupt pipe for status: fCommCompletionInfo.target = this; fCommCompletionInfo.action = commReadComplete; fCommCompletionInfo.parameter = NULL; if (fCommPipe) { //rtn = fCommPipe->Read(fCommPipeMDP, &fCommCompletionInfo, NULL); rtn = kIOReturnSuccess; } if (rtn == kIOReturnSuccess) { // Read the data-in bulk pipe: fReadCompletionInfo.target = this; fReadCompletionInfo.action = dataReadComplete; fReadCompletionInfo.parameter = NULL; rtn = fInPipe->Read(fPipeInMDP, 5000, // 5 seconds until timeout 5000, fPipeInMDP->getLength(), &fReadCompletionInfo, NULL); // // rtn = fInPipe->Read(fPipeInMDP, &fReadCompletionInfo, NULL); if (rtn == kIOReturnSuccess) { // Set up the data-out bulk pipe: //fWriteCompletionInfo.target = this; //fWriteCompletionInfo.action = dataWriteComplete; //fWriteCompletionInfo.parameter = NULL; // for now, filled in with the mbuf address when sent for (int i=0; isetTimeoutMS(WATCHDOG_TIMER_MS); fReady = true; } return true; }/* end wakeUp */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::putToSleep // // Inputs: // // Outputs: Return Code - true(we're asleep), false(failed) // // Desc: Do clean up and suspend the device. // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::putToSleep() { //IOReturn ior; IOLog("AJZaurusUSB::putToSleep\n"); fReady = false; if (fTimerSource) fTimerSource->cancelTimeout(); setLinkStatus(0, 0); // Release all resources releaseResources(); //if (!fTerminate) //{ // if (fbmAttributes & kUSBAtrBusPowered) // { // ior = fpDevice->SuspendDevice(true); // Suspend the device again (if supported and not unplugged) // if (ior) // { // ALERT(0, ior, 'rPSD', "net_lucid_cake_driver_AJZaurusUSB::releasePort - SuspendDevice error"); // } // } //} // AJ: The above is commented out because it's an endless source of // trouble (at least with the Zaurus, probably also with other // PDAs). // Not trying to suspend/wake up the Zaurus at all seems to be just // fine (it won't suspend anyway upon SuspendDevice(true)). if (fTerminate && (!fReady)) // if it's the result of a terminate and no interfaces enabled we also need to close the device { fpDevice->close(this); fpDevice = NULL; } }/* end putToSleep */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::disable // // Inputs: netif - the interface being disabled // // Outputs: Return code - kIOReturnSuccess // // Desc: Called by IOEthernetInterface client to disable the controller. // This method is always called while running on the default workloop // thread // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::disable(IONetworkInterface *netif) { IOLog("AJZaurusUSB::disable\n"); // Disable our IOOutputQueue object. This will prevent the // outputPacket() method from being called fTransmitQueue->stop(); // Flush all packets currently in the output queue fTransmitQueue->setCapacity(0); fTransmitQueue->flush(); putToSleep(); fNetifEnabled = false; fReady = false; return kIOReturnSuccess; }/* end disable */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::close // // Inputs: // // Outputs: // // Desc: Close the driver. // /****************************************************************************************************/ #if 0 bool net_lucid_cake_driver_AJZaurusUSB::close() { } #endif /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::stop // // Inputs: provider - my provider // // Outputs: None // // Desc: Stops // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::stop(IOService *provider) { IOLog("AJZaurusUSB::stop\n"); if (fNetworkInterface) { detachInterface(fNetworkInterface); fNetworkInterface->release(); fNetworkInterface = NULL; } if (fCommInterface) { if (fCommInterface != fDataInterface) fCommInterface->close(this); fCommInterface->release(); fCommInterface = NULL; } if (fDataInterface) { fDataInterface->close(this); fDataInterface->release(); fDataInterface = NULL; } if (fpDevice) { fpDevice->close(this); fpDevice = NULL; } if (fMediumDict) { fMediumDict->release(); fMediumDict = NULL; } if (fTransmitQueue) { fTransmitQueue->release(); fTransmitQueue = NULL; } super::stop(provider); return; }/* end stop */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::detach // // Inputs: // // Outputs: // // Desc: Detach the driver. // /****************************************************************************************************/ #if 0 // default method from superclass bool net_lucid_cake_driver_AJZaurusUSB::detach(IOService *provider) { } #endif /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::free // // Inputs: None // // Outputs: None // // Desc: Clean up and free the log // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::free() { IOLog("AJZaurusUSB::free\n"); #if USE_ELG if (g.evLogBuf) IOFree(g.evLogBuf, kEvLogSize); #endif /* USE_ELG */ super::free(); IOSimpleLockFree(fLock); return; }/* end free */ /* EOF */./Sources/CRC.cpp0000755000076500007650000001342510473767036013412 0ustar hnshns00000000000000/* File: CRC.cpp Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #include "CRC.h" // AJ: begin CRC code (ported from Linux driver usbdnet.c written by // Stuart Lynne and Tom Rushworth // with some algorithms adopted from usbnet.c by // David Brownell // --> UInt32 crc32_table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; /* EOF */./Sources/CRC.h0000755000076500007650000000747610473767037013071 0ustar hnshns00000000000000/* File: CRC.h Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #ifndef INCLUDE_CRC_H #define INCLUDE_CRC_H #include /* UINT_MAX */ // needs both to declare UInt32 #include #include // AJ: begin CRC code (ported from Linux driver usbdnet.c written by // Stuart Lynne and Tom Rushworth // with some algorithms adopted from usbnet.c by // David Brownell // --> extern UInt32 crc32_table[256]; #define CRC32_INITFCS 0xffffffff // Initial FCS value #define CRC32_GOODFCS 0xdebb20e3 // Good final FCS value #define CRC32_FCS(fcs, c) (((fcs) >> 8) ^ crc32_table[((fcs) ^ (c)) & 0xff]) /* fcs_memcpy32 - memcpy and calculate fcs * Perform a memcpy and calculate fcs using ppp 32bit CRC algorithm. */ static inline UInt32 fcs_memcpy32(unsigned char *dp, unsigned char *sp, int len, UInt32 fcs) { for (;len-- > 0; fcs = CRC32_FCS(fcs, *dp++ = *sp++)); return fcs; } /* fcs_pad32 - pad and calculate fcs * Pad and calculate fcs using ppp 32bit CRC algorithm. */ static inline UInt32 fcs_pad32(unsigned char *dp, int len, UInt32 fcs) { for (;len-- > 0; fcs = CRC32_FCS(fcs, *dp++ = '\0')); return fcs; } /* fcs_compute32 - memcpy and calculate fcs * Perform a memcpy and calculate fcs using ppp 32bit CRC algorithm. */ static inline UInt32 fcs_compute32(unsigned char *sp, int len, UInt32 fcs) { for (;len-- > 0; fcs = CRC32_FCS(fcs, *sp++)); return fcs; } // <-- #endif INCLUDE_CRC_H /* EOF */./Sources/Driver.h0000755000076500007650000003216010541761604013667 0ustar hnshns00000000000000/* File: Driver.h Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): <0.5.0> Nov 2006 increased stability; made work on Intel Macs <0.3.4> Aug 2006 Source file split into modules .... <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduced a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes to the sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ /***** For fans of kprintf, IOLog and debugging infrastructure of the *****/ /***** string ilk, please modify the ELG and PAUSE macros or their *****/ /***** associated EvLog and Pause functions to suit your taste. These *****/ /***** macros currently are set up to log events to a wraparound *****/ /***** buffer with minimal performance impact. They take 2 UInt32 *****/ /***** parameters so that when the buffer is dumped 16 bytes per line, *****/ /***** time stamps (~1 microsecond) run down the left side while *****/ /***** unique 4-byte ASCII codes can be read down the right side. *****/ /***** Preserving this convention facilitates different maintainers *****/ /***** using different debugging styles with minimal code clutter. *****/ #include /* UINT_MAX */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include #include } #define DEBUG 1 #include "Logging.h" #define TRANSMIT_QUEUE_SIZE 5 // How does this relate to MAX_BLOCK_SIZE? #define WATCHDOG_TIMER_MS 1000 #define MAX_BLOCK_SIZE PAGE_SIZE #define COMM_BUFF_SIZE 16 // must be a multiple of Mac packet Size of endpoint (8) #define kFiltersSupportedMask 0xefff #define kPipeStalled 1 #define kOutBufPool 100 // try to lower this in future versions (without producing stalls) #define kOutBuffThreshold 10 // USB CDC Definitions (Ethernet Control Model) #define kEthernetControlModel 6 #define kMDLM 0x0a // Requests enum { kSend_Encapsulated_Command = 0, kGet_Encapsulated_Response = 1, kSet_Ethernet_Multicast_Filter = 0x40, kSet_Ethernet_PM_Packet_Filter = 0x41, kGet_Ethernet_PM_Packet_Filter = 0x42, kSet_Ethernet_Packet_Filter = 0x43, kGet_Ethernet_Statistics = 0x44, kGet_AUX_Inputs = 4, kSet_AUX_Outputs = 5, kSet_Temp_MAC = 6, kGet_Temp_MAC = 7, kSet_URB_Size = 8, kSet_SOFS_To_Wait = 9, kSet_Even_Packets = 10, kScan = 0xFF }; // Notifications enum { kNetwork_Connection = 0, kResponse_Available = 1, kConnection_Speed_Change = 0x2A }; enum { CS_INTERFACE = 0x24, Header_FunctionalDescriptor = 0x00, CM_FunctionalDescriptor = 0x01, Union_FunctionalDescriptor = 0x06, CS_FunctionalDescriptor = 0x07, Enet_Functional_Descriptor = 0x0f, CM_ManagementData = 0x01, CM_ManagementOnData = 0x02 }; // Stats of interest in bmEthernetStatistics (bit definitions) enum { kXMIT_OK = 0x01, // Byte 1 kRCV_OK = 0x02, kXMIT_ERROR = 0x04, kRCV_ERROR = 0x08, kRCV_CRC_ERROR = 0x02, // Byte 3 kRCV_ERROR_ALIGNMENT = 0x08, kXMIT_ONE_COLLISION = 0x10, kXMIT_MORE_COLLISIONS = 0x20, kXMIT_DEFERRED = 0x40, kXMIT_MAX_COLLISION = 0x80, kRCV_OVERRUN = 0x01, // Byte 4 kXMIT_TIMES_CARRIER_LOST = 0x08, kXMIT_LATE_COLLISIONS = 0x10 }; // Stats request definitions enum { kXMIT_OK_REQ = 0x0001, kRCV_OK_REQ = 0x0002, kXMIT_ERROR_REQ = 0x0003, kRCV_ERROR_REQ = 0x0004, kRCV_CRC_ERROR_REQ = 0x0012, kRCV_ERROR_ALIGNMENT_REQ = 0x0014, kXMIT_ONE_COLLISION_REQ = 0x0015, kXMIT_MORE_COLLISIONS_REQ = 0x0016, kXMIT_DEFERRED_REQ = 0x0017, kXMIT_MAX_COLLISION_REQ = 0x0018, kRCV_OVERRUN_REQ = 0x0019, kXMIT_TIMES_CARRIER_LOST_REQ = 0x001c, kXMIT_LATE_COLLISIONS_REQ = 0x001d }; enum { kCDCPowerOffState = 0, kCDCPowerOnState = 1, kNumCDCStates = 2 }; // Packet Filter definitions enum { kPACKET_TYPE_PROMISCUOUS = 0x0001, kPACKET_TYPE_ALL_MULTICAST = 0x0002, kPACKET_TYPE_DIRECTED = 0x0004, kPACKET_TYPE_BROADCAST = 0x0008, kPACKET_TYPE_MULTICAST = 0x0010 }; typedef struct { UInt8 bFunctionLength; UInt8 bDescriptorType; UInt8 bDescriptorSubtype; } HeaderFunctionalDescriptor; typedef struct { UInt8 bFunctionLength; UInt8 bDescriptorType; UInt8 bDescriptorSubtype; UInt8 bmCapabilities; UInt8 bDataInterface; } CMFunctionalDescriptor; typedef struct { UInt8 bFunctionLength; UInt8 bDescriptorType; UInt8 bDescriptorSubtype; UInt8 iMACAddress; UInt8 bmEthernetStatistics[4]; UInt8 wMaxSegmentSize[2]; UInt8 wNumberMCFilters[2]; UInt8 bNumberPowerFilters; } EnetFunctionalDescriptor; typedef struct { UInt8 bFunctionLength; UInt8 bDescriptorType; UInt8 bDescriptorSubtype; UInt8 bMasterInterface; UInt8 bSlaveInterface[]; } UnionFunctionalDescriptor; typedef struct { IOBufferMemoryDescriptor *pipeOutMDP; UInt8 *pipeOutBuffer; mbuf_t m; IOUSBCompletion writeCompletionInfo; } pipeOutBuffers; #define super IOEthernetController class net_lucid_cake_driver_AJZaurusUSB : public IOEthernetController { OSDeclareDefaultStructors(net_lucid_cake_driver_AJZaurusUSB); // Constructor & Destructor stuff private: bool fTerminate; // Are we being terminated (ie the device was unplugged) UInt8 fbmAttributes; // Device attributes UInt16 fVendorID; UInt16 fProductID; char vendorString[50]; char modelString[50]; char serialString[50]; IOEthernetInterface *fNetworkInterface; // the interface of which we are the Client IOBasicOutputQueue *fTransmitQueue; IOWorkLoop *fWorkLoop; IONetworkStats *fpNetStats; IOEthernetStats *fpEtherStats; IOTimerEventSource *fTimerSource; OSDictionary *fMediumDict; bool fReady; bool fNetifEnabled; bool fWOL; bool fDataDead; bool fCommDead; UInt8 fLinkStatus; UInt32 fUpSpeed; UInt32 fDownSpeed; UInt16 fPacketFilter; IOUSBInterface *fCommInterface; IOUSBInterface *fDataInterface; IOUSBPipe *fInPipe; IOUSBPipe *fOutPipe; IOUSBPipe *fCommPipe; IOBufferMemoryDescriptor *fCommPipeMDP; IOBufferMemoryDescriptor *fPipeInMDP; //IOBufferMemoryDescriptor *fPipeOutMDP; UInt8 *fCommPipeBuffer; UInt8 *fPipeInBuffer; pipeOutBuffers fPipeOutBuff[kOutBufPool]; UInt8 fCommInterfaceNumber; UInt8 fDataInterfaceNumber; UInt32 fCount; UInt32 fOutPacketSize; bool fPadded; bool fChecksum; UInt8 fInterfaceClass; // interface class UInt8 fInterfaceSubClass; IOSimpleLock* fLock; SInt32 fDataCount; bool fOutputStalled; UInt8 fEaddr[6]; // ethernet address UInt16 fMax_Block_Size; UInt16 fMcFilters; UInt8 fEthernetStatistics[4]; UInt16 fCurrStat; UInt32 fStatValue; UInt8 fPowerState; bool fStatInProgress; bool fInputPktsOK; bool fInputErrsOK; bool fOutputPktsOK; bool fOutputErrsOK; IOUSBCompletion fCommCompletionInfo; IOUSBCompletion fReadCompletionInfo; //IOUSBCompletion fWriteCompletionInfo; IOUSBCompletion fMERCompletionInfo; IOUSBCompletion fStatsCompletionInfo; // callbacks static void commReadComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); static void dataReadComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); static void dataWriteComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); static void merWriteComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); static void statsWriteComplete(void *obj, void *param, IOReturn rc, UInt32 remaining); // internal CDC Driver instance Methods bool wakeUp(void); void putToSleep(void); bool createMediumTables(void); bool allocateResources(void); void releaseResources(void); bool configureDevice(UInt8 numConfigs); void dumpDevice(UInt8 numConfigs); bool getFunctionalDescriptors(void); bool createNetworkInterface(void); bool USBTransmitPacket(mbuf_t packet); bool USBSetMulticastFilter(IOEthernetAddress *addrs, UInt32 count); bool USBSetPacketFilter(void); IOReturn clearPipeStall(IOUSBPipe *thePipe); void resetDevice(void); void receivePacket(UInt8 *packet, UInt32 size); static void timerFired(OSObject *owner, IOTimerEventSource *sender); void timeoutOccurred(IOTimerEventSource *timer); public: IOUSBDevice *fpDevice; // our provider (USB device) // IOKit methods virtual bool init(OSDictionary *properties = 0); virtual IOService *probe(IOService *provider, SInt32 *score); virtual bool start(IOService *provider); virtual IOReturn message(UInt32 type, IOService *provider, void *argument = 0); virtual void free(void); virtual void stop(IOService *provider); // IOEthernetController methods virtual IOReturn enable(IONetworkInterface *netif); UInt32 outputPacket(mbuf_t pkt, void *param); virtual IOReturn disable(IONetworkInterface *netif); virtual IOReturn setWakeOnMagicPacket(bool active); virtual IOReturn getPacketFilters(const OSSymbol *group, UInt32 *filters ) const; virtual IOReturn selectMedium(const IONetworkMedium *medium); virtual IOReturn getHardwareAddress(IOEthernetAddress *addr); virtual IOReturn setMulticastMode(IOEnetMulticastMode mode); virtual IOReturn setMulticastList(IOEthernetAddress *addrs, UInt32 count); virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode); virtual IOOutputQueue *createOutputQueue(void); virtual const OSString *newVendorString(void) const; virtual const OSString *newModelString(void) const; virtual const OSString *newRevisionString(void) const; virtual bool configureInterface(IONetworkInterface *netif); virtual bool createWorkLoop(); virtual IOWorkLoop* getWorkLoop() const; // Power Manager bool initForPM(IOService *provider); unsigned long initialPowerStateForDomainState(IOPMPowerFlags flags); IOReturn setPowerState(unsigned long, IOService *); }; /* end class net_lucid_cake_driver_AJZaurusUSB */ ./Sources/Glue.cpp0000755000076500007650000005471610542022650013666 0ustar hnshns00000000000000/* File: Glue.cpp This module glues the Client and the Provider interface so that they work together as a Ethernet over USB driver It provides a packet queue and manages resources Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #include "Driver.h" static struct MediumTable { UInt32 type; UInt32 speed; } mediumTable[] = { {kIOMediumEthernetNone, 0}, {kIOMediumEthernetAuto, 0}, {kIOMediumEthernet10BaseT | kIOMediumOptionHalfDuplex, 10}, {kIOMediumEthernet10BaseT | kIOMediumOptionFullDuplex, 10}, {kIOMediumEthernet100BaseTX | kIOMediumOptionHalfDuplex, 100}, {kIOMediumEthernet100BaseTX | kIOMediumOptionFullDuplex, 100} }; /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::commReadComplete // // Inputs: obj - me // param - parameter block(the Port) // rc - return code // remaining - what's left // (whose idea was that?) // // Outputs: None // // Desc: Interrupt pipe (Comm interface) read completion routine // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::commReadComplete(void *obj, void *param, IOReturn rc, UInt32 remaining) { net_lucid_cake_driver_AJZaurusUSB *me = (net_lucid_cake_driver_AJZaurusUSB*)obj; IOReturn ior; UInt32 dLen; UInt8 notif; if (!me->fReady) { return; } if (rc == kIOReturnSuccess) // If operation returned ok { dLen = /*COMM_BUFF_SIZE*/ me->fCommPipeMDP->getLength() - remaining; IOLog("AJZaurusUSB::commReadComplete - len=%lu\n", dLen); // Now look at the state stuff LogData(kUSBAnyDirn, dLen, me->fCommPipeBuffer); notif = me->fCommPipeBuffer[1]; if (dLen > 7) { switch(notif) { case kNetwork_Connection: me->fLinkStatus = me->fCommPipeBuffer[2]; IOLog("AJZaurusUSB::commReadComplete - kNetwork_Connection - link Status %d\n", me->fLinkStatus); break; case kConnection_Speed_Change: // In you-know-whose format me->fUpSpeed = USBToHostLong(*((UInt32 *)&me->fCommPipeBuffer[8])); me->fDownSpeed = USBToHostLong(*((UInt32 *)&me->fCommPipeBuffer[13])); IOLog("AJZaurusUSB::commReadComplete - kConnection_Speed_Change up=%lu down=%lu\n", me->fUpSpeed, me->fDownSpeed); break; default: IOLog("AJZaurusUSB::commReadComplete - Unknown notification: %d\n", notif); break; } } else IOLog("AJZaurusUSB::commReadComplete - Invalid notification %d\n", notif); } else IOLog("AJZaurusUSB::commReadComplete - IO error: %d %s\n", rc, me->stringFromReturn(rc)); // Queue the next read, only if not aborted if (rc != kIOReturnAborted) { ior = me->fCommPipe->Read(me->fCommPipeMDP, 5000, // 5 seconds until timeout 5000, me->fCommPipeMDP->getLength(), &me->fCommCompletionInfo, NULL); // ior = me->fCommPipe->Read(me->fCommPipeMDP, &me->fCommCompletionInfo, NULL); if (ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::commReadComplete - Failed to queue next read: %d %s\n", ior, me->stringFromReturn(ior)); if (ior == kIOUSBPipeStalled) { me->fCommPipe->ClearPipeStall(false); ior = me->fCommPipe->Read(me->fCommPipeMDP, 5000, // 5 seconds until timeout 5000, me->fCommPipeMDP->getLength(), &me->fCommCompletionInfo, NULL); // ior = me->fCommPipe->Read(me->fCommPipeMDP, &me->fCommCompletionInfo, NULL); if (ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::commReadComplete - Failed, read dead: %d %s\n", ior, me->stringFromReturn(ior)); me->fCommDead = true; } } } } }/* end commReadComplete */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::dataReadComplete // // Inputs: obj - me // param - unused // rc - return code // remaining - what's left // // Outputs: None // // Desc: BulkIn pipe (Data interface) read completion routine // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::dataReadComplete(void *obj, void *param, IOReturn rc, UInt32 remaining) { net_lucid_cake_driver_AJZaurusUSB *me = (net_lucid_cake_driver_AJZaurusUSB*)obj; UInt32 dLen; IOReturn ior; if(!me->fReady) { #if 1 IOLog("AJZaurusUSB::dataReadComplete - not ready\n"); #endif return; } if(rc == kIOReturnSuccess) // If operation returned ok { dLen=me->fPipeInMDP->getLength() - remaining; #if 0 IOLog("AJZaurusUSB::dataReadComplete - len=%lu\n", dLen); #endif LogData(kUSBIn, dlen, me->fPipeInBuffer); me->receivePacket(me->fPipeInBuffer, dLen); // Move the incoming bytes up the stack } else { // some error IOLog("AJZaurusUSB::dataReadComplete - IO err: %d %s\n", rc, me->fDataInterface->stringFromReturn(rc)); #if 1 if(rc == kIOUSBPipeStalled) { IOLog("AJZaurusUSB::dataReadComplete - err=kIOUSBPipeStalled\n"); // rc = me->clearPipeStall(me->fInPipe); rc = me->fInPipe->ClearPipeStall(false); if(rc != kIOReturnSuccess) IOLog("AJZaurusUSB::dataReadComplete - clear pipe stall failed: %d %s\n", rc, me->fDataInterface->stringFromReturn(rc)); } else ; // other reason!!! #endif } // Queue the next read ior = me->fInPipe->Read(me->fPipeInMDP, 5000, // 5 seconds until timeout 5000, me->fPipeInMDP->getLength(), &me->fReadCompletionInfo, NULL); // ior = me->fInPipe->Read(me->fPipeInMDP, &me->fReadCompletionInfo, NULL); if(ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::dataReadComplete - Failed to queue read: %d %s\n", ior, me->fDataInterface->stringFromReturn(rc)); if(ior == kIOUSBPipeStalled) { // IOLog("AJZaurusUSB::dataReadComplete - err=kIOUSBPipeStalled\n"); me->fInPipe->ClearPipeStall(false); ior = me->fInPipe->Read(me->fPipeInMDP, 5000, // 5 seconds until timeout 5000, me->fPipeInMDP->getLength(), &me->fReadCompletionInfo, NULL); // ior = me->fInPipe->Read(me->fPipeInMDP, &me->fReadCompletionInfo, NULL); if(ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::dataReadComplete - Failed again, read dead: %d %s\n", ior, me->fDataInterface->stringFromReturn(rc)); me->fDataDead = true; } } } } /* end dataReadComplete */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::dataWriteComplete // // Inputs: obj - me // param - pool index // rc - return code // remaining - what's left // // Outputs: None // // Desc: BulkOut pipe (Data interface) write completion routine // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::dataWriteComplete(void *obj, void *param, IOReturn rc, UInt32 remaining) { net_lucid_cake_driver_AJZaurusUSB *me = (net_lucid_cake_driver_AJZaurusUSB *)obj; //mbuf_t m; //UInt32 pktLen = 0; //UInt32 numbufs = 0; UInt32 poolIndx; SInt32 dataCount = 0; bool stalled = FALSE; #if 0 IOLog("AJZaurusUSB::dataWriteComplete\n"); #endif if (!me->fReady) { IOLog("AJZaurusUSB::dataWriteComplete - not ready\n"); return; } poolIndx = (UInt32)param; if (rc == kIOReturnSuccess) // If operation returned ok { #if 0 IOLog("AJZaurusUSB::dataWriteComplete - pool index=%lu\n", poolIndx); #endif IOSimpleLockLock(me->fLock); --(me->fDataCount); dataCount = me->fDataCount; stalled = me->fOutputStalled; if(stalled) IOLog("AJZaurusUSB::dataWriteComplete - was stalled\n"); me->fOutputStalled = false; // no longer... me->fPipeOutBuff[poolIndx].m = NULL; // free up buffer IOSimpleLockUnlock(me->fLock); } else { IOLog("AJZaurusUSB::dataWriteComplete - IO err %d\n", rc); // FIXME: what do we do with the buffer? if (rc != kIOReturnAborted) { // rc = me->clearPipeStall(me->fOutPipe); rc = me->fOutPipe->ClearPipeStall(false); if (rc != kIOReturnSuccess) { IOLog("AJZaurusUSB::dataWriteComplete - clear pipe stall failed (trying to continue): %d\n", rc); } } } if (stalled && dataCount == 0) { IOLog("AJZaurusUSB:dataWriteComplete - trying to revive a stalled queue\n"); me->fTransmitQueue->service(IOBasicOutputQueue::kServiceAsync); // revive a stalled transmit queue } // me->fTransmitQueue->service(); // always revive a stalled queue return; }/* end dataWriteComplete */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::merWriteComplete // // Inputs: obj - me // param - parameter block (may or may not be present depending on request) // rc - return code // remaining - what's left // // Outputs: None // // Desc: Management element request write completion routine // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::merWriteComplete(void *obj, void *param, IOReturn rc, UInt32 remaining) { IOUSBDevRequest *MER = (IOUSBDevRequest*)param; UInt16 dataLen; if (MER) { if (rc == kIOReturnSuccess) { #if 0 IOLog("AJZaurusUSB::merWriteComplete (request=%d, remaining=%lu)\n", MER->bRequest, remaining); #endif } else IOLog("AJZaurusUSB::merWriteComplete (%d) - io err: %d\n", MER->bRequest, rc); dataLen = MER->wLength; #if 0 IOLog("AJZaurusUSB::merWriteComplete - data length %d\n", dataLen); #endif if(dataLen != 0 && (MER->pData)) IOFree(MER->pData, dataLen); IOFree(MER, sizeof(IOUSBDevRequest)); } else { if (rc == kIOReturnSuccess) { #if 0 IOLog("AJZaurusUSB::merWriteComplete (request=unknown, remaining=%lu)\n", remaining); #endif } else IOLog("AJZaurusUSB::merWriteComplete (unknown) - io err: %d\n", rc); } }/* end merWriteComplete */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::statsWriteComplete // // Inputs: obj - me // param - parameter block // rc - return code // remaining - what's left // // Outputs: None // // Desc: Ethernet statistics request write completion routine // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::statsWriteComplete(void *obj, void *param, IOReturn rc, UInt32 remaining) { net_lucid_cake_driver_AJZaurusUSB *me = (net_lucid_cake_driver_AJZaurusUSB *)obj; IOUSBDevRequest *STREQ = (IOUSBDevRequest*)param; UInt16 currStat; if (STREQ) { if (rc == kIOReturnSuccess && me->fReady) { IOLog("AJZaurusUSB::statsWriteComplete - request=%d remaining=%lu\n", STREQ->bRequest, remaining); currStat = STREQ->wValue; switch(currStat) { case kXMIT_OK_REQ: me->fpNetStats->outputPackets = USBToHostLong(me->fStatValue); break; case kRCV_OK_REQ: me->fpNetStats->inputPackets = USBToHostLong(me->fStatValue); break; case kXMIT_ERROR_REQ: me->fpNetStats->outputErrors = USBToHostLong(me->fStatValue); break; case kRCV_ERROR_REQ: me->fpNetStats->inputErrors = USBToHostLong(me->fStatValue); break; case kRCV_CRC_ERROR_REQ: me->fpEtherStats->dot3StatsEntry.fcsErrors = USBToHostLong(me->fStatValue); break; case kRCV_ERROR_ALIGNMENT_REQ: me->fpEtherStats->dot3StatsEntry.alignmentErrors = USBToHostLong(me->fStatValue); break; case kXMIT_ONE_COLLISION_REQ: me->fpEtherStats->dot3StatsEntry.singleCollisionFrames = USBToHostLong(me->fStatValue); break; case kXMIT_MORE_COLLISIONS_REQ: me->fpEtherStats->dot3StatsEntry.multipleCollisionFrames = USBToHostLong(me->fStatValue); break; case kXMIT_DEFERRED_REQ: me->fpEtherStats->dot3StatsEntry.deferredTransmissions = USBToHostLong(me->fStatValue); break; case kXMIT_MAX_COLLISION_REQ: me->fpNetStats->collisions = USBToHostLong(me->fStatValue); break; case kRCV_OVERRUN_REQ: me->fpEtherStats->dot3StatsEntry.frameTooLongs = USBToHostLong(me->fStatValue); break; case kXMIT_TIMES_CARRIER_LOST_REQ: me->fpEtherStats->dot3StatsEntry.carrierSenseErrors = USBToHostLong(me->fStatValue); break; case kXMIT_LATE_COLLISIONS_REQ: me->fpEtherStats->dot3StatsEntry.lateCollisions = USBToHostLong(me->fStatValue); break; default: IOLog("AJZaurusUSB::statsWriteComplete - Invalid stats code (currstat=%d): %d\n", currStat, rc); break; } } else IOLog("AJZaurusUSB::statsWriteComplete - request %d io err:%d\n", STREQ->bRequest, rc); IOFree(STREQ, sizeof(IOUSBDevRequest)); } else { if(rc == kIOReturnSuccess) IOLog("AJZaurusUSB::statsWriteComplete (request unknown) - remaining=%lu\n", remaining); else IOLog("AJZaurusUSB::statsWriteComplete (request unknown) - io err: %d\n", rc); } me->fStatValue = 0; me->fStatInProgress = false; return; }/* end statsWriteComplete */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::timerFired // // Inputs: owner and sender // // Outputs: // // Desc: Static member function called when a timer event fires. // Forwards this call to the timeOutOccurred method // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::timerFired(OSObject *owner, IOTimerEventSource *sender) { // IOLog("com_apple_driver_dts_USBCDCEthernet::timerFired\n"); if (owner) { net_lucid_cake_driver_AJZaurusUSB* target = OSDynamicCast(net_lucid_cake_driver_AJZaurusUSB, owner); if (target) { target->timeoutOccurred(sender); } } }/* end timerFired */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::createNetworkInterface // // Inputs: // // Outputs: return Code - true (created and initialilzed ok), false (it failed) // // Desc: Creates and initializes the network interface // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::createNetworkInterface() { IOLog("AJZaurusUSB::createNetworkInterface\n"); // Allocate memory for buffers etc fTransmitQueue = (IOBasicOutputQueue*)getOutputQueue(); if (!fTransmitQueue) { IOLog("AJZaurusUSB::createNetworkInterface - Output queue initialization failed\n"); return false; } fTransmitQueue->retain(); // Get a reference to the IOWorkLoop in our superclass fWorkLoop = getWorkLoop(); // Allocate Timer event source fTimerSource = IOTimerEventSource::timerEventSource(this, timerFired); if (fTimerSource == NULL) { IOLog("AJZaurusUSB::createNetworkInterface - Allocate Timer event source failed\n"); return false; } if (fWorkLoop->addEventSource(fTimerSource) != kIOReturnSuccess) { IOLog("AJZaurusUSB::start - Add Timer event source failed\n"); return false; } // Attach an IOEthernetInterface client IOLog("AJZaurusUSB::createNetworkInterface - attaching and registering interface\n"); if (!attachInterface((IONetworkInterface **)&fNetworkInterface, true)) { IOLog("AJZaurusUSB::createNetworkInterface - attachInterface failed\n"); return false; } // Ready to service interface requests //fNetworkInterface->registerService(); // AJ: this is already achieved by attachInterface // with a second parameter of true. IOLog("AJZaurusUSB::createNetworkInterface - Exiting, successful\n"); return true; }/* end createNetworkInterface */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::createOutputQueue // // Inputs: // // Outputs: Return code - the output queue // // Desc: Creates the output queue // /****************************************************************************************************/ IOOutputQueue* net_lucid_cake_driver_AJZaurusUSB::createOutputQueue() { IOLog("AJZaurusUSB::createOutputQueue\n"); return IOBasicOutputQueue::withTarget(this, TRANSMIT_QUEUE_SIZE); }/* end createOutputQueue */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::createMediumTables // // Inputs: // // Outputs: Return code - true (tables created), false (not created) // // Desc: Creates the medium tables // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::createMediumTables() { IONetworkMedium *medium; UInt64 maxSpeed; UInt32 i; IOLog("AJZaurusUSB::createMediumTables\n"); maxSpeed = 100; fMediumDict = OSDictionary::withCapacity(sizeof(mediumTable) / sizeof(mediumTable[0])); if (fMediumDict == 0) { IOLog("AJZaurusUSB::createMediumTables - create dict. failed\n" ); return false; } for (i = 0; i < sizeof(mediumTable) / sizeof(mediumTable[0]); i++ ) { medium = IONetworkMedium::medium(mediumTable[i].type, mediumTable[i].speed); if (medium && (medium->getSpeed() <= maxSpeed)) { IONetworkMedium::addMedium(fMediumDict, medium); medium->release(); } } if (publishMediumDictionary(fMediumDict) != true) { IOLog("AJZaurusUSB::createMediumTables - publish dict. failed\n" ); return false; } medium = IONetworkMedium::getMediumWithType(fMediumDict, kIOMediumEthernetAuto); setCurrentMedium(medium); return true; }/* end createMediumTables */ /* EOF */./Sources/Logging.cpp0000755000076500007650000001750510526424662014366 0ustar hnshns00000000000000/* File: Logging.cpp Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #include "Driver.h" #if USE_ELG static globals g; // Instantiate the globals /****************************************************************************************************/ // // Function: AllocateEventLog // // Inputs: size - amount of memory to allocate // // Outputs: None // // Desc: Allocates the event log buffer // /****************************************************************************************************/ static void AllocateEventLog(UInt32 size) { if (g.evLogBuf) return; g.evLogFlag = 0; // assume insufficient memory g.evLogBuf = (UInt8*)IOMalloc(size); if (!g.evLogBuf) { kprintf("net_lucid_cake_driver_AJZaurusUSB evLog allocation failed "); return; } bzero(g.evLogBuf, size); g.evLogBufp = g.evLogBuf; g.evLogBufe = g.evLogBufp + kEvLogSize - 0x20; // ??? overran buffer? g.evLogFlag = 0xFEEDBEEF; // continuous wraparound // g.evLogFlag = 'step'; // stop at each ELG // g.evLogFlag = 0x0333; // any nonzero - don't wrap - stop logging at buffer end IOLog("AllocateEventLog - &globals=%8x buffer=%8x\n", (unsigned int)&g, (unsigned int)g.evLogBuf); return; }/* end AllocateEventLog */ /****************************************************************************************************/ // // Function: EvLog // // Inputs: a - anything, b - anything, ascii - 4 charater tag, str - any info string // // Outputs: None // // Desc: Writes the various inputs to the event log buffer // /****************************************************************************************************/ static void EvLog(UInt32 a, UInt32 b, UInt32 ascii, char* str) { register UInt32 *lp; // Long pointer mach_timespec_t time; if (g.evLogFlag == 0) return; IOGetTime(&time); lp = (UInt32*)g.evLogBufp; g.evLogBufp += 0x10; if (g.evLogBufp >= g.evLogBufe) // handle buffer wrap around if any { g.evLogBufp = g.evLogBuf; if (g.evLogFlag != 0xFEEDBEEF) // make 0xFEEDBEEF a symbolic ??? g.evLogFlag = 0; // stop tracing if wrap undesired } // compose interrupt level with 3 byte time stamp: *lp++ = (g.intLevel << 24) | ((time.tv_nsec >> 10) & 0x003FFFFF); // ~ 1 microsec resolution *lp++ = a; *lp++ = b; *lp = ascii; if(g.evLogFlag == 'step') { static char code[ 5 ] = {0,0,0,0,0}; *(UInt32*)&code = ascii; IOLog("%8x net_lucid_cake_driver_AJZaurusUSB: %8x %8x %s\n", time.tv_nsec>>10, (unsigned int)a, (unsigned int)b, code); } return; }/* end EvLog */ #endif // USE_ELG #if LOG_DATA /****************************************************************************************************/ // // Function: Asciify // // Inputs: i - the nibble // // Outputs: return byte - ascii byte // // Desc: Converts to ascii. // /****************************************************************************************************/ static UInt8 Asciify(UInt8 i) { i &= 0xF; if (i < 10) return('0' + i); else return(('A'-10) + i); }/* end Asciify */ #define dumplen 32 // Set this to the number of bytes to dump and the rest should work out correct #define buflen ((dumplen*2)+dumplen)+3 #define Asciistart (dumplen*2)+3 /****************************************************************************************************/ // // Function: USBLogData // // Inputs: Dir - direction // Count - number of bytes // buf - the data // // Outputs: // // Desc: Puts the data in the log. // /****************************************************************************************************/ static void USBLogData(UInt8 Dir, UInt32 Count, char *buf) { UInt8 wlen, i, Aspnt, Hxpnt; UInt8 wchr; char LocBuf[buflen+1]; for (i=0; i<=buflen; i++) { LocBuf[i] = 0x20; } LocBuf[i] = 0x00; if (Dir == kUSBIn) { IOLog("AJZaurusUSB:: USBLogData - Read Complete, size = %8x\n", Count); } else { if (Dir == kUSBOut) { IOLog("AJZaurusUSB:: USBLogData - Write, size = %8x\n", Count); } else { if (Dir == kUSBAnyDirn) { IOLog("AJZaurusUSB:: USBLogData - Other, size = %8x\n", Count); } } } if (Count > dumplen) { wlen = dumplen; } else { wlen = Count; } if (wlen > 0) { Aspnt = Asciistart; Hxpnt = 0; for (i=1; i<=wlen; i++) { wchr = buf[i-1]; LocBuf[Hxpnt++] = Asciify(wchr >> 4); LocBuf[Hxpnt++] = Asciify(wchr); if ((wchr < 0x20) || (wchr > 0x7F)) // Non printable characters { LocBuf[Aspnt++] = 0x2E; // Replace with a period } else { LocBuf[Aspnt++] = wchr; } } LocBuf[(wlen + Asciistart) + 1] = 0x00; IOLog("%s\n", LocBuf); IOSleep(Sleep_Time); // Try and keep the log from overflowing } else { IOLog("AJZaurusUSB: USBLogData - No data, Count=0\n"); } }/* end USBLogData */ #endif // LOG_DATA /* EOF */./Sources/Logging.h0000755000076500007650000001172710526424662014033 0ustar hnshns00000000000000/* File: Logging.h Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduced a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes to the sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ /***** For fans of kprintf, IOLog and debugging infrastructure of the *****/ /***** string ilk, please modify the ELG and PAUSE macros or their *****/ /***** associated EvLog and Pause functions to suit your taste. These *****/ /***** macros currently are set up to log events to a wraparound *****/ /***** buffer with minimal performance impact. They take 2 UInt32 *****/ /***** parameters so that when the buffer is dumped 16 bytes per line, *****/ /***** time stamps (~1 microsecond) run down the left side while *****/ /***** unique 4-byte ASCII codes can be read down the right side. *****/ /***** Preserving this convention facilitates different maintainers *****/ /***** using different debugging styles with minimal code clutter. *****/ #ifndef INCLUDE_LOGGING_H #define INCLUDE_LOGGING_H #include /* UINT_MAX */ #include #include #include #include #include #include extern "C" { #include #include } #define LDEBUG 0 // for debugging #define USE_ELG 0 // to event log - LDEBUG must also be set #define kEvLogSize (4096*16) // 16 pages = 64K = 4096 events #define LOG_DATA 0 // logs data to the IOLog - LDEBUG must also be set #define Sleep_Time 20 #if LDEBUG #if USE_ELG #define ELG(A,B,ASCI,STRING) EvLog((UInt32)(A), (UInt32)(B), (UInt32)(ASCI), STRING) #else /* not USE_ELG */ #define ELG(A,B,ASCI,STRING) {IOLog("AJZaurusUSB: %8x %8x " STRING "\n", (unsigned int)(A), (unsigned int)(B));IOSleep(Sleep_Time);} #endif /* USE_ELG */ #if LOG_DATA #define LogData(D, C, b) USBLogData((UInt8)D, (UInt32)C, (char *)b) #else /* not LOG_DATA */ #define LogData(D, C, b) #endif /* LOG_DATA */ #else /* not LDEBUG */ #define ELG(A,B,ASCI,S) #define LogData(D, C, b) #undef USE_ELG #undef LOG_DATA #endif /* LDEBUG */ #if DEBUG // nothing #else #define IOLog(...) // remove all logging code #endif // #define ALERT(A,B,ASCI,STRING) {IOLog("AJZaurusUSB: %8x %8x " STRING "\n", (unsigned int)(A), (unsigned int)(B));} // Globals typedef struct globals // Globals for this module (not per instance) { UInt32 evLogFlag; // debugging only UInt8 *evLogBuf; UInt8 *evLogBufe; UInt8 *evLogBufp; UInt8 intLevel; } globals; #endif INCLUDE_LOGGING_H /* EOF */ ./Sources/Power.cpp0000755000076500007650000001244710541763570014075 0ustar hnshns00000000000000/* File: Power.cpp This module manages power up and down of the Mac Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.1 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ #include "Driver.h" static IOPMPowerState gOurPowerStates[kNumCDCStates] = { {1,0,0,0,0,0,0,0,0,0,0,0}, {1,IOPMDeviceUsable,IOPMPowerOn,IOPMPowerOn,0,0,0,0,0,0,0,0} }; /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::initForPM // // Inputs: provider - my provider // // Outputs: return code - true(initialized), false(failed) // // Desc: Add ourselves to the power management tree so we can do // the right thing on sleep/wakeup. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::initForPM(IOService *provider) { fPowerState = kCDCPowerOnState; // init our power state to be 'on' PMinit(); // init power manager instance variables provider->joinPMtree(this); // add us to the power management tree if (pm_vars != NULL) { // register ourselves with ourself as policy-maker registerPowerDriver(this, gOurPowerStates, kNumCDCStates); return true; } else { IOLog("AJZaurusUSB::initForPM - Initializing power manager failed\n"); } return false; }/* end initForPM */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::initialPowerStateForDomainState // // Inputs: flags - // // Outputs: return code - Current power state // // Desc: Request for our initial power state. // /****************************************************************************************************/ unsigned long net_lucid_cake_driver_AJZaurusUSB::initialPowerStateForDomainState(IOPMPowerFlags flags) { return fPowerState; }/* end initialPowerStateForDomainState */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::setPowerState // // Inputs: whatState - new state // // Outputs: Return code - IOPMAckImplied // // Desc: We are notified to turn power on/off // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::setPowerState(unsigned long whatState, IOService *whatDevice) { // turn your device on/off here IOLog("AJZaurusUSB::setPowerState state:%lu\n", whatState); if(whatState == kCDCPowerOffState || whatState == kCDCPowerOnState) { IOLog("AJZaurusUSB::setPowerState - power %d\n", whatState); if(whatState == fPowerState) return IOPMAckImplied; // unchanged fPowerState=whatState; if(fPowerState == kCDCPowerOnState) { IOLog("AJZaurusUSB::setPowerState - powered on\n"); // do whatever we need to do resetDevice(); } return IOPMNoErr; } return IOPMNoSuchState; } /* EOF */./Sources/Provider.cpp0000755000076500007650000015554210542024033014560 0ustar hnshns00000000000000/* File: Provider.cpp This module provides a packet oriented communication channel over USB Description: This is an experimental driver that enables Mac OS X to communicate with a Sharp Zaurus over IP over USB. It is based on the USBCDCEthernet example which is Copyright 1998-2002 Apple Computer, Inc. All rights reserved. Portions have been ported from usbdnet.c (Linux driver) written by Stuart Lynne and Tom Rushworth with some algorithms adopted from usbnet.c written by David Brownell . Original description for USBCDCEthernet: This is a sample USB Communication Device Class (CDC) driver, Ethernet model. Note that this sample has not been tested against any actual hardware since there are very few CDC Ethernet devices currently in existence. This sample requires Mac OS X 10.4 and later. If built on a version prior to Mac OS X 10.2, a compiler warning "warning: ANSI C++ forbids data member `ip_opts' with same name as enclosing class" will be issued. This warning can be ignored. Copyright: Copyright 2002, 2003 Andreas Junghans Copyright 2004-2006 H. Nikolaus Schaller Disclaimer: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Change History (most recent first): 2004-2005 Support for Zaurus C1000, C3000 made compile on MacOS X 10.4 with Xcode 2.0 power management added <7> 07/04/03 Support for Zaurus C760. <6> 02/18/03 Increased stability + support for iPaq/Opie. <5> 02/10/03 Bug fix (introduces a workloop). <4> 01/24/03 Support for more Zaurus models. <3> 01/11/03 Modified to include latest changes from sample driver (provided by Russ Winsper ) <2> 12/22/02 Modified to support the Sharp Zaurus (and some bug fixes) <1> 11/08/02 New sample (provided by Apple Computer, Inc.) */ extern "C" { #include "CRC.h" } #include "Driver.h" /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::metaClass // // Inputs: class, superclass // // Outputs: - // // Desc: This macro defines the constructor and destructor, implements the OSMetaClass // allocation member function (alloc) for the class, and supplies the metaclass // information for the runtime typing system. // /****************************************************************************************************/ OSDefineMetaClassAndStructors(net_lucid_cake_driver_AJZaurusUSB, IOEthernetController); /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::configureDevice // // Inputs: numConfigs - number of configurations present // // Outputs: return Code - true (device configured), false (device not configured) // // Desc: Finds the configurations and then the appropriate interfaces etc. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::configureDevice(UInt8 numConfigs) { IOUSBFindInterfaceRequest req; // device request const IOUSBInterfaceDescriptor *altInterfaceDesc; IOReturn ior = kIOReturnSuccess; UInt16 numends = 0; UInt16 alt; const IOUSBConfigurationDescriptor *cd = NULL; // configuration descriptor // IOUSBInterfaceDescriptor *intf = NULL; // interface descriptor UInt8 cval; UInt8 config = 0; UInt8 idx; IOLog("AJZaurusUSB::configureDevice %d configs\n", numConfigs); #if 1 dumpDevice(numConfigs); #endif // Make sure we have a CDC interface to play with /* we must go through all configurations IF Class IF Subclass 2 6 found - it is the Interrupt interface of Familiar 2 10 found - it is the Interrupt interface of Zaurus 10 0 data interface of Familiar - but that might be found in the RNDIS configuration as well 2 2 Interrupt interface of RNDIS for Familiar - skip */ for(cval=0; cvalGetFullConfigurationDescriptor(cval); if(!cd) { IOLog("AJZaurusUSB::configureDevice - Error getting the full configuration descriptor\n"); continue; // try next one } config = cd->bConfigurationValue; #if 1 IOLog("AJZaurusUSB::configureDevice - matching Interface descriptor found: %u\n", config); #endif ior = fpDevice->SetConfiguration(this, config); // set this configuration as the current configuration if(ior != kIOReturnSuccess) { IOLog("AJZaurusUSB::configureDevice - SetConfiguration error: %d %s\n", ior, this->stringFromReturn(ior)); return false; } fbmAttributes = cd->bmAttributes; #if 1 IOLog("AJZaurusUSB::configureDevice - bmAttributes=%08x\n", fbmAttributes); #endif interface=NULL; req.bInterfaceClass = kIOUSBFindInterfaceDontCare; req.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; req.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; req.bAlternateSetting = kIOUSBFindInterfaceDontCare; while(interface=fpDevice->FindNextInterface(interface, &req)) { // got next interface #if 1 IOLog("AJZaurusUSB::configureDevice - InterfaceClass=%d\n", interface->GetInterfaceClass()); IOLog("AJZaurusUSB::configureDevice - InterfaceSubClass=%d\n", interface->GetInterfaceSubClass()); IOLog("AJZaurusUSB::configureDevice - InterfaceProtocol=%d\n", interface->GetInterfaceProtocol()); #endif if(!interface) { IOLog("AJZaurusUSB::configureDevice - no interface for interface descriptor\n"); continue; } if(interface->GetInterfaceClass() && interface->GetInterfaceSubClass() == kMDLM) { // found a Zaurus compatible configuration #if 1 IOLog("AJZaurusUSB::configureDevice - MDLM interface found\n"); #endif fPadded = true; fChecksum = true; break; } if(interface->GetInterfaceClass() && interface->GetInterfaceSubClass() == kEthernetControlModel) { // found a Familiar Handheld Linux compatible configuration #if 1 IOLog("AJZaurusUSB::configureDevice - ECM interface found\n"); #endif fPadded = false; fChecksum = false; break; } } if(!interface) { // we have checked all interfaces - try next configuration IOLog("AJZaurusUSB::configureDevice - no matching interface for configuration %d\n", cval); continue; } fCommInterface=interface; // we have found the Comm interface fCommInterfaceNumber = interface->GetInterfaceNumber(); fInterfaceClass = interface->GetInterfaceClass(); fInterfaceSubClass = interface->GetInterfaceSubClass(); break; } if(cval == numConfigs) { IOLog("AJZaurusUSB::configureDevice - no matching Interface descriptor found\n"); return false; } // Save the ID's fVendorID = fpDevice->GetVendorID(); fProductID = fpDevice->GetProductID(); #if 1 IOLog("AJZaurusUSB::configureDevice - comm Interface=%p\n", fCommInterface); IOLog("AJZaurusUSB::configureDevice - vendor id=%d (0x%04x)\n", fVendorID, fVendorID); IOLog("AJZaurusUSB::configureDevice - product id=%d (0x%04x)\n", fProductID, fProductID); IOLog("AJZaurusUSB::configureDevice - power id=%lumA\n", 2*fpDevice->GetBusPowerAvailable()); IOLog("AJZaurusUSB::configureDevice - max packet size for Endpoint 0=%u\n", fpDevice->GetMaxPacketSize()); IOLog("AJZaurusUSB::configureDevice - speed=%u\n", fpDevice->GetSpeed()); #endif idx=fpDevice->GetManufacturerStringIndex(); if(idx) fpDevice->GetStringDescriptor(idx, vendorString, sizeof(vendorString)-2); idx=fpDevice->GetProductStringIndex(); if(idx) fpDevice->GetStringDescriptor(idx, modelString, sizeof(modelString)-2); idx=fpDevice->GetSerialNumberStringIndex(); if(idx) fpDevice->GetStringDescriptor(idx, serialString, sizeof(serialString)-2); #if 1 IOLog("AJZaurusUSB::configureDevice - manufacturer=%s\n", vendorString); IOLog("AJZaurusUSB::configureDevice - product=%s\n", modelString); IOLog("AJZaurusUSB::configureDevice - serial number=%s idx=%u\n", serialString, idx); #endif if(!getFunctionalDescriptors()) { IOLog("AJZaurusUSB::configureDevice - getFunctionalDescriptors failed\n"); return false; } if(fInterfaceSubClass == kMDLM) { // Zaurus (MDLM) uses same interface for comm&data but separates endpoints fDataInterface = fCommInterface; // use the same } else { // open the separate comm interface here if we have an ECM device #if 1 IOLog("AJZaurusUSB::configureDevice - comm interface %p\n", fCommInterface); IOLog("AJZaurusUSB::configureDevice - ConfigValue %d\n", fCommInterface->GetConfigValue()); IOLog("AJZaurusUSB::configureDevice - AlternateSetting %d\n", fCommInterface->GetAlternateSetting()); IOLog("AJZaurusUSB::configureDevice - InterfaceClass %d\n", fCommInterface->GetInterfaceClass()); IOLog("AJZaurusUSB::configureDevice - InterfaceSubClass %d\n", fCommInterface->GetInterfaceSubClass()); IOLog("AJZaurusUSB::configureDevice - InterfaceProtocol %d\n", fCommInterface->GetInterfaceProtocol()); IOLog("AJZaurusUSB::configureDevice - InterfaceNumber %d\n", fCommInterface->GetInterfaceNumber()); IOLog("AJZaurusUSB::configureDevice - NumEndpoints %d\n", fCommInterface->GetNumEndpoints()); IOLog("AJZaurusUSB::configureDevice - BusyState %lu\n", fCommInterface->getBusyState()); IOLog("AJZaurusUSB::configureDevice - Inactive %d\n", fCommInterface->isInactive()); IOLog("AJZaurusUSB::configureDevice - Open(any) %d\n", fCommInterface->isOpen()); IOLog("AJZaurusUSB::configureDevice - Open(this) %d\n", fCommInterface->isOpen(this)); #endif if(!fCommInterface->open(this, kIOServiceSeize)) { IOLog("AJZaurusUSB::configureDevice - open comm interface failed %p\n", fCommInterface); // // This is a Horrible Hack if some other driver has already opened our channel!!! // while(fCommInterface->isOpen()) { IOLog("AJZaurusUSB::configureDevice - forced close of interfering comm interface for client %p\n", fCommInterface->getClient()); fCommInterface->close(fCommInterface->getClient()); } if(!fCommInterface->open(this, kIOServiceSeize)) { IOLog("AJZaurusUSB::configureDevice - open comm interface failed again %p\n", fCommInterface); fCommInterface = NULL; return false; } } req.bInterfaceClass = 10; req.bInterfaceSubClass = 0; req.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; req.bAlternateSetting = kIOUSBFindInterfaceDontCare; fDataInterface = fpDevice->FindNextInterface(NULL, &req); // find matching data interface with 2 endpoints if(!fDataInterface) { IOLog("AJZaurusUSB::configureDevice - Find(Next)Interface for Communications-Data failed\n"); fCommInterface->close(this); // close fCommInterface = NULL; return false; } } numends = fDataInterface->GetNumEndpoints(); IOLog("AJZaurusUSB::configureDevice - %d Data Class interfaces\n", numends); if(numends > 1) // There must be (at least) two bulk endpoints { //IOLog("AJZaurusUSB::configureDevice - Standard interface works\n"); IOLog("AJZaurusUSB::configureDevice - Data Class interface found: %p\n", fDataInterface); if (!fDataInterface->open(this)) { IOLog("AJZaurusUSB::configureDevice - open data interface failed %p\n", fDataInterface); numends = 0; } } else { IOLog("AJZaurusUSB::configureDevice - Standard interface 0 DOESN'T work\n"); altInterfaceDesc = fDataInterface->FindNextAltInterface(NULL, &req); if (!altInterfaceDesc) IOLog("AJZaurusUSB:::configureDevice - FindNextAltInterface failed\n"); while (altInterfaceDesc) { numends = altInterfaceDesc->bNumEndpoints; if (numends > 1) { if (fDataInterface->open(this)) { alt = altInterfaceDesc->bAlternateSetting; IOLog("AJZaurusUSB::configureDevice - Data Class interface (alternate) found: %u\n", alt); ior = fDataInterface->SetAlternateInterface(this, alt); if (ior == kIOReturnSuccess) { IOLog("AJZaurusUSB::configureDevice - Alternate set\n"); break; } else { IOLog("AJZaurusUSB::configureDevice - SetAlternateInterface failed %d %s\n", ior, this->stringFromReturn(ior)); numends = 0; } } else { IOLog("AJZaurusUSB::configureDevice - open data interface failed\n"); numends = 0; } } else { IOLog("AJZaurusUSB::configureDevice - No endpoints this alternate %p\n", altInterfaceDesc); } altInterfaceDesc = fDataInterface->FindNextAltInterface(altInterfaceDesc, &req); } } if (numends < 2) { IOLog("AJZaurusUSB::configureDevice - Finding a Data Class interface failed\n"); if (fCommInterface != fDataInterface) fCommInterface->close(this); // close only once if shared fCommInterface = NULL; fDataInterface->close(this); fDataInterface = NULL; return false; } fCommInterface->retain(); fDataInterface->retain(); // Found both so now let's publish the interface if (!createNetworkInterface()) { IOLog("AJZaurusUSB::configureDevice - createNetworkInterface failed\n"); if (fCommInterface != fDataInterface) fCommInterface->close(this); fCommInterface->release(); fCommInterface = NULL; fDataInterface->close(this); fDataInterface->release(); fDataInterface = NULL; return false; } //IOLog("AJZaurusUSB::configureDevice - attributes from configuration descriptor\n"); /*if (fbmAttributes & kUSBAtrBusPowered) { ior = fpDevice->SuspendDevice(true); // Suspend the device (if supported and bus powered) if (ior) { IOLog("AJZaurusUSB::configureDevice - SuspendDevice error %d\n", ior); } }*/ // AJ: The above is commented out because it caused a lot of trouble, and I // can't imagine why it would make sense to *suspend* the device here. return true; }/* end configureDevice */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::configureInterface // // Inputs: netif - the interface being configured // // Outputs: Return code - true (configured ok), false (not) // // Desc: Finish the network interface configuration // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::configureInterface(IONetworkInterface *netif) { IONetworkData *nd; IOLog("AJZaurusUSB::configureInterface threadself=%p netif=%p\n", IOThreadSelf(), netif); if(super::configureInterface(netif) == false) { IOLog("AJZaurusUSB::configureInterface - super failed\n"); return false; } // Get a pointer to the statistics structure in the interface nd = netif->getNetworkData(kIONetworkStatsKey); if (!nd || !(fpNetStats = (IONetworkStats *)nd->getBuffer())) { IOLog("AJZaurusUSB::configureInterface - Invalid network statistics\n"); return false; } // Get the Ethernet statistics structure: nd = netif->getParameter(kIOEthernetStatsKey); if (!nd || !(fpEtherStats = (IOEthernetStats*)nd->getBuffer())) { IOLog("AJZaurusUSB::configureInterface - Invalid ethernet statistics\n"); return false; } return true; }/* end configureInterface */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::configureDevice // // Inputs: numConfigs - number of configurations present // // Outputs: return Code - true (CDC present), false (CDC not present) // // Desc: Determines if this is a CDC compliant device and then sets the configuration // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::dumpDevice(UInt8 numConfigs) { IOUSBFindInterfaceRequest req; const IOUSBConfigurationDescriptor *cd = NULL; // configuration descriptor IOUSBInterfaceDescriptor *intf = NULL; // interface descriptor IOReturn ior = kIOReturnSuccess; UInt8 cval; UInt8 intfCount = 0; IOLog("AJZaurusUSB::dumpDevice - Enumerating %d configurations ...\n", numConfigs); for (cval=0; cvalGetFullConfigurationDescriptor(cval); if(!cd) IOLog("AJZaurusUSB::dumpDevice - Enumeration failure\n"); else { req.bInterfaceClass = kIOUSBFindInterfaceDontCare; req.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; req.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; req.bAlternateSetting = kIOUSBFindInterfaceDontCare; for(intfCount=0, intf = NULL; TRUE; intfCount++) { ior = fpDevice->FindNextInterfaceDescriptor(cd, intf, &req, &intf); if(ior != kIOReturnSuccess) { if(ior == kIOUSBInterfaceNotFound) break; // end of list IOLog("AJZaurusUSB::dumpDevive - Interface %d[%u]: can't dump %d %s\n", intfCount, cval, ior, this->stringFromReturn(ior)); continue; } IOLog("AJZaurusUSB::dumpDevive - Interface %d[%u] found\n", intfCount, cval); IOLog("AJZaurusUSB::dumpDevice - bLength=%d\n", intf->bLength); IOLog("AJZaurusUSB::dumpDevice - bDescriptorType=%d\n", intf->bDescriptorType); IOLog("AJZaurusUSB::dumpDevice - bInterfaceNumber=%d\n", intf->bInterfaceNumber); IOLog("AJZaurusUSB::dumpDevice - bInterfaceClass=%d\n", intf->bInterfaceClass); IOLog("AJZaurusUSB::dumpDevice - bInterfaceSubClass=%d\n", intf->bInterfaceSubClass); IOLog("AJZaurusUSB::dumpDevice - bInterfaceProtocol=%d\n", intf->bInterfaceProtocol); IOLog("AJZaurusUSB::dumpDevice - bAlternateSetting=%d\n", intf->bAlternateSetting); IOLog("AJZaurusUSB::dumpDevice - bNumEndpoints=%d\n", intf->bNumEndpoints); IOLog("AJZaurusUSB::dumpDevice - iInterface=%d\n", intf->iInterface); } } } } /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::getFunctionalDescriptors // // Inputs: // // Outputs: return - true (descriptors ok), false (somethings not right or not supported) // // Desc: Finds all the functional descriptors for the specific interface // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::getFunctionalDescriptors() { IOReturn ior; HeaderFunctionalDescriptor *funcDesc = NULL; EnetFunctionalDescriptor *ENETFDesc = NULL; IOLog("AJZaurusUSB::getFunctionalDescriptors\n"); while((funcDesc = (HeaderFunctionalDescriptor*) fCommInterface->FindNextAssociatedDescriptor((void *)funcDesc, CS_INTERFACE))) { // loop through all functional descriptors switch (funcDesc->bDescriptorSubtype) { case Header_FunctionalDescriptor: IOLog("AJZaurusUSB::getFunctionalDescriptors - Header Functional Descriptor - type=%d subtype=%d\n", funcDesc->bDescriptorType, funcDesc->bDescriptorSubtype); break; case Enet_Functional_Descriptor: ENETFDesc = (EnetFunctionalDescriptor *) funcDesc; IOLog("AJZaurusUSB::getFunctionalDescriptors - Ethernet Functional Descriptor - type=%d subtype=%d\n", funcDesc->bDescriptorType, funcDesc->bDescriptorSubtype); break; case Union_FunctionalDescriptor: IOLog("AJZaurusUSB::getFunctionalDescriptors - Union Functional Descriptor - type=%d subtype=%d\n", funcDesc->bDescriptorType, funcDesc->bDescriptorSubtype); break; default: IOLog("AJZaurusUSB::getFunctionalDescriptors - unknown Functional Descriptor - type=%d subtype=%d\n", funcDesc->bDescriptorType, funcDesc->bDescriptorSubtype); break; } } if(ENETFDesc) { // The Enet Func. Desc. must be present // Determine who is collecting the input/output network stats. fOutputPktsOK = !(ENETFDesc->bmEthernetStatistics[0] & kXMIT_OK); fInputPktsOK = !(ENETFDesc->bmEthernetStatistics[0] & kRCV_OK); fOutputErrsOK = !(ENETFDesc->bmEthernetStatistics[0] & kXMIT_ERROR); fInputErrsOK = !(ENETFDesc->bmEthernetStatistics[0] & kRCV_ERROR); // Save the stats (it's bit mapped) fEthernetStatistics[0] = ENETFDesc->bmEthernetStatistics[0]; fEthernetStatistics[1] = ENETFDesc->bmEthernetStatistics[1]; fEthernetStatistics[2] = ENETFDesc->bmEthernetStatistics[2]; fEthernetStatistics[3] = ENETFDesc->bmEthernetStatistics[3]; // Save the multicast filters (remember it's intel format) fMcFilters = USBToHostWord(*(UInt16 *)ENETFDesc->wNumberMCFilters); // Get the Ethernet address if (ENETFDesc->iMACAddress != 0) { ior = fpDevice->GetStringDescriptor(ENETFDesc->iMACAddress, (char *)&fEaddr, 6); if (ior == kIOReturnSuccess) { IOLog("AJZaurusUSB::getFunctionalDescriptors - Ethernet address (string %d): %02x.%02x.%02x.%02x.%02x.%02x\n", ENETFDesc->iMACAddress, (unsigned) fEaddr[0], (unsigned) fEaddr[1], (unsigned) fEaddr[2], (unsigned) fEaddr[3], (unsigned) fEaddr[4], (unsigned) fEaddr[5] ); // LogData(kUSBAnyDirn, 6, fEaddr); fMax_Block_Size = USBToHostWord(*(UInt16 *)ENETFDesc->wMaxSegmentSize); IOLog("AJZaurusUSB::getFunctionalDescriptors - Maximum segment size %d\n", fMax_Block_Size); return true; // all ok! } IOLog("AJZaurusUSB::getFunctionalDescriptors - Error retrieving Ethernet address\n"); } } IOLog("AJZaurusUSB::getFunctionalDescriptors - Using defaults 'cause all else failed\n"); // FIXME: This is a hack! An evil one! // (I really need to find out how to interpret the descriptors returned by the iPaq.) fOutputPktsOK = false; fInputPktsOK = false; fOutputErrsOK = false; fInputErrsOK = false; fEthernetStatistics[0] = 0; fEthernetStatistics[1] = 0; fEthernetStatistics[2] = 0; fEthernetStatistics[3] = 0; fMcFilters = 0; // no filters fMax_Block_Size = 0xea00; // default MAX_BLOCK_SIZE; fEaddr[0] = 0x34; // default Ethernet address fEaddr[1] = 0x30; fEaddr[2] = 0x30; fEaddr[3] = 0x30; fEaddr[4] = 0x30; fEaddr[5] = 0x00; return true; }/* end getFunctionalDescriptors */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::setWakeOnMagicPacket // // Inputs: active - true(wake), false(don't) // // Outputs: Return code - kIOReturnSuccess // // Desc: Set for wake on magic packet // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::setWakeOnMagicPacket(bool active) { IOLog("AJZaurusUSB::setWakeOnMagicPacket active:%d\n", active); fWOL = active; if (fbmAttributes & kUSBAtrRemoteWakeup) { // Clear the feature if wake-on-lan is not set (SetConfiguration sets the feature // automatically if the device supports remote wake up) if (!active) { IOUSBDevRequest devreq; IOReturn ior; devreq.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBStandard, kUSBDevice); devreq.bRequest = kUSBRqClearFeature; devreq.wValue = kUSBFeatureDeviceRemoteWakeup; devreq.wIndex = 0; devreq.wLength = 0; devreq.pData = 0; ior = fpDevice->DeviceRequest(&devreq); if (ior == kIOReturnSuccess) IOLog("AJZaurusUSB::configureDevice - Clearing remote wake up feature successful: %d\n", ior); else IOLog("AJZaurusUSB::configureDevice - Clearing remote wake up feature failed: %d %s\n", ior, this->stringFromReturn(ior)); } } else IOLog("AJZaurusUSB::configureDevice - Remote wake up not supported\n"); return kIOReturnSuccess; }/* end setWakeOnMagicPacket */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::getPacketFilters // // Inputs: group - the filter group // // Outputs: Return code - kIOReturnSuccess and others // filters - the capability // // Desc: Set the filter capability for the driver // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::getPacketFilters(const OSSymbol *group, UInt32 *filters) const { IOReturn rtn = kIOReturnSuccess; IOLog("AJZaurusUSB::getPacketFilters - group=%p filters=%p\n", group, filters); if (group == gIOEthernetWakeOnLANFilterGroup) { if (fbmAttributes & kUSBAtrRemoteWakeup) *filters = kIOEthernetWakeOnMagicPacket; else *filters = 0; } else if (group == gIONetworkFilterGroup) *filters = kIOPacketFilterUnicast | kIOPacketFilterBroadcast | kIOPacketFilterMulticast | kIOPacketFilterMulticastAll | kIOPacketFilterPromiscuous; else rtn = super::getPacketFilters(group, filters); // use default if (rtn != kIOReturnSuccess) IOLog("AJZaurusUSB::getPacketFilters failed: %d\n", rtn /*, stringFromReturn(rtn) */); return rtn; }/* end getPacketFilters */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::selectMedium // // Inputs: // // Outputs: // // Desc: Lets us know if someone is playing with ifconfig // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::selectMedium(const IONetworkMedium *medium) { IOLog("AJZaurusUSB::selectMedium\n"); setSelectedMedium(medium); return kIOReturnSuccess; }/* end selectMedium */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::getHardwareAddress // // Inputs: // // Outputs: Return code - kIOReturnSuccess or kIOReturnError // ea - the address // // Desc: Get the ethernet address from the hardware (actually the descriptor) // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::getHardwareAddress(IOEthernetAddress *ea) { UInt32 i; IOLog("AJZaurusUSB::getHardwareAddress\n"); for(i=0; i<6; i++) { ea->bytes[i] = fEaddr[i]; } return kIOReturnSuccess; }/* end getHardwareAddress */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::newVendorString // // Inputs: // // Outputs: Return code - the vendor string // // Desc: Identifies the hardware vendor // /****************************************************************************************************/ const OSString* net_lucid_cake_driver_AJZaurusUSB::newVendorString() const { IOLog("AJZaurusUSB::newVendorString %s\n", vendorString); return OSString::withCString(vendorString); // Maybe we should use what we got from the descriptors }/* end newVendorString */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::newModelString // // Inputs: // // Outputs: Return code - the model string // // Desc: Identifies the hardware model // /****************************************************************************************************/ const OSString* net_lucid_cake_driver_AJZaurusUSB::newModelString() const { IOLog("AJZaurusUSB::newModelString %s\n", modelString); return OSString::withCString(modelString); // Maybe we should use the descriptors }/* end newModelString */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::newRevisionString // // Inputs: // // Outputs: Return code - the revision string // // Desc: Identifies the hardware revision // /****************************************************************************************************/ const OSString* net_lucid_cake_driver_AJZaurusUSB::newRevisionString() const { IOLog("AJZaurusUSB::newRevisionString %s\n", serialString); return OSString::withCString(serialString); }/* end newRevisionString */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::setMulticastMode // // Inputs: active - true (set it), false (don't) // // Outputs: Return code - kIOReturnSuccess // // Desc: Sets multicast mode // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::setMulticastMode(bool active) { IOLog("AJZaurusUSB::setMulticastMode active=%d\n", active); if (active) { fPacketFilter |= kPACKET_TYPE_ALL_MULTICAST; } else { fPacketFilter &= ~kPACKET_TYPE_ALL_MULTICAST; } USBSetPacketFilter(); return kIOReturnSuccess; }/* end setMulticastMode */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::setMulticastList // // Inputs: addrs - list of addresses // count - number in the list // // Outputs: Return code - kIOReturnSuccess or kIOReturnIOError // // Desc: Sets multicast list // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::setMulticastList(IOEthernetAddress *addrs, UInt32 count) { bool uStat; IOLog("AJZaurusUSB::setMulticastList addrs=%p count=%lu\n", addrs, count); if (count != 0) { uStat = USBSetMulticastFilter(addrs, count); if (!uStat) { return kIOReturnIOError; } } return kIOReturnSuccess; }/* end setMulticastList */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::setPromiscuousMode // // Inputs: active - true (set it), false (don't) // // Outputs: Return code - kIOReturnSuccess // // Desc: Sets promiscuous mode // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::setPromiscuousMode(bool active) { IOLog("AJZaurusUSB::setPromiscuousMode %d\n", active); if (active) { fPacketFilter |= kPACKET_TYPE_PROMISCUOUS; } else { fPacketFilter &= ~kPACKET_TYPE_PROMISCUOUS; } USBSetPacketFilter(); return kIOReturnSuccess; }/* end setPromiscuousMode */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::USBTransmitPacket // // Inputs: packet - the packet // // Outputs: Return code - true (transmit started), false (it didn't) // // Desc: Set up and then transmit the packet // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::USBTransmitPacket(mbuf_t packet) { UInt32 numbufs = 0; // number of mbufs for this packet mbuf_t m; // current mbuf UInt32 total_pkt_length = 0; // AJ: new local variables // --> UInt32 new_pkt_length; UInt32 checksum_length; UInt32 fcs; UInt32 pad; // <-- UInt32 rTotal = 0; IOReturn ior = kIOReturnSuccess; UInt32 poolIndx; UInt16 tryCount = 0; // Count the number of mbufs in this packet m = packet; while (m) { total_pkt_length += mbuf_len(m); numbufs++; m = mbuf_next(m); } // AJ: Calculate size including CRC and padding // --> checksum_length = fChecksum?4:0; if (fPadded) { // we need to pad so that after appending the CRC we have a multiple of packetsize less one new_pkt_length = fOutPacketSize * ( ((total_pkt_length + checksum_length) / fOutPacketSize) + 1) - 1; } else { if (fChecksum) // require a minimum of one full packet new_pkt_length = MAX(fOutPacketSize, total_pkt_length + checksum_length); else new_pkt_length = total_pkt_length; } // <-- #if 0 IOLog("AJZaurusUSB::USBTransmitPacket %p padded:%d checksum:%d length:%lu mbufs:%lu\n", packet, fPadded, fChecksum, new_pkt_length, numbufs); #endif if (new_pkt_length+1 > fMax_Block_Size) { IOLog("AJZaurusUSB::USBTransmitPacket - Bad packet size\n"); // Note for now and revisit later if (fOutputErrsOK) fpNetStats->outputErrors++; // OSIncrementAtomic(&fSyncCount); return false; } // Find a free ouput buffer in the pool IOSimpleLockLock(fLock); while(TRUE) { // try to get a buffer for(poolIndx=0; poolIndx kOutBuffThreshold) { // waited too long IOLog("AJZaurusUSB::USBTransmitPacket - Exceeded output buffer wait threshold - output stalled\n"); if(fOutputErrsOK) fpNetStats->outputErrors++; IOSimpleLockUnlock(fLock); fOutputStalled = true; return false; } IOLog("AJZaurusUSB::USBTransmitPacket - Waiting %d-th time for output buffer\n", tryCount); IOSleep(1); // sleep 1 second } fPipeOutBuff[poolIndx].m = packet; ++fDataCount; if(fDataCount > kOutBufPool-10) IOLog("AJZaurusUSB::USBTransmitPacket - Warning %ld of %d output buffers in use!\n", fDataCount, kOutBufPool); if(fOutputStalled) IOLog("AJZaurusUSB::USBTransmitPacket - Output no longer stalled\n"); fOutputStalled = false; IOSimpleLockUnlock(fLock); // Start filling in the send buffer // AJ: modified to do CRC calculation and padding // --> fcs = CRC32_INITFCS; m = packet; // start with the first mbuf of the packet rTotal = 0; // running total do { if (mbuf_len(m) == 0) // Ignore zero length mbufs continue; fcs = fcs_memcpy32(&(fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal]), (unsigned char*) mbuf_data(m), mbuf_len(m), fcs); //bcopy(mtod(m, unsigned char *), &fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal], mbuf_len(m)); rTotal += mbuf_len(m); } while ((m = mbuf_next(m)) != 0); if ((pad = new_pkt_length - rTotal - checksum_length) > 0) { // pad to required length less four (CRC), copy fcs and append pad byte if required fcs = fcs_pad32(&(fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal]), pad, fcs); rTotal += pad; } fcs = ~fcs; if (fChecksum) { fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal++] = fcs&0xff; fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal++] = (fcs>>8)&0xff; fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal++] = (fcs>>16)&0xff; fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal++] = (fcs>>24)&0xff; } // append a byte if required, we over-allocated by one to allow for this if (fPadded) { if (!(rTotal % fOutPacketSize)) { fPipeOutBuff[poolIndx].pipeOutBuffer[rTotal++] = 0; } } #if 0 IOLog("AJZaurusUSB::USBTransmitPacket - length=%lu checksum=%08lx\n", rTotal, fcs); #endif // <-- // LogData(kUSBOut, rTotal, fPipeOutBuff[poolIndx].pipeOutBuffer); //fPipeOutBuff[poolIndx].m = packet; fPipeOutBuff[poolIndx].writeCompletionInfo.parameter = (void *)poolIndx; fPipeOutBuff[poolIndx].pipeOutMDP->setLength(rTotal); ior = fOutPipe->Write(fPipeOutBuff[poolIndx].pipeOutMDP, 5000, 5000, fPipeOutBuff[poolIndx].pipeOutMDP->getLength(), &(fPipeOutBuff[poolIndx].writeCompletionInfo)); if (ior != kIOReturnSuccess) { //OSIncrementAtomic(&fSyncCount); IOLog("AJZaurusUSB::USBTransmitPacket - Write failed: ior=%d %s\n", ior, this->stringFromReturn(ior)); if (ior == kIOUSBPipeStalled) { IOLog("AJZaurusUSB::USBTransmitPacket - Pipe stalled\n"); //OSDecrementAtomic(&fSyncCount); fOutPipe->ClearPipeStall(false); // reset and try again ior = fOutPipe->Write(fPipeOutBuff[poolIndx].pipeOutMDP, 5000, 5000, fPipeOutBuff[poolIndx].pipeOutMDP->getLength(), &(fPipeOutBuff[poolIndx].writeCompletionInfo)); if (ior != kIOReturnSuccess) { //OSIncrementAtomic(&fSyncCount); IOLog("AJZaurusUSB::USBTransmitPacket - Write really failed: %d %s\n", ior, this->stringFromReturn(ior)); if(fOutputErrsOK) fpNetStats->outputErrors++; IOSimpleLockLock(fLock); --fDataCount; fPipeOutBuff[poolIndx].m = NULL; IOSimpleLockUnlock(fLock); return false; } } else { // other error IOSimpleLockLock(fLock); --fDataCount; fPipeOutBuff[poolIndx].m = NULL; IOSimpleLockUnlock(fLock); return false; } } freePacket(packet); if (fOutputPktsOK) fpNetStats->outputPackets++; return true; }/* end USBTransmitPacket */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::USBSetMulticastFilter // // Inputs: addrs - the list of addresses // count - How many // // Outputs: // // Desc: Set up and send SetMulticastFilter Management Element Request(MER). // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::USBSetMulticastFilter(IOEthernetAddress *addrs, UInt32 count) { IOReturn rc; IOUSBDevRequest *MER; UInt8 *eaddrs; UInt32 eaddLen; UInt32 i,j,rnum; IOLog("AJZaurusUSB::USBSetMulticastFilter - filters=%d count=%lu\n", fMcFilters, count); if (count > (UInt32)(fMcFilters & kFiltersSupportedMask)) { IOLog("AJZaurusUSB::USBSetMulticastFilter - No multicast filters supported\n"); return false; } MER = (IOUSBDevRequest*)IOMalloc(sizeof(IOUSBDevRequest)); if (!MER) { IOLog("AJZaurusUSB::USBSetMulticastFilter - allocate MER failed\n"); return false; } bzero(MER, sizeof(IOUSBDevRequest)); eaddLen = count * kIOEthernetAddressSize; eaddrs = (UInt8 *)IOMalloc(eaddLen); if (!eaddrs) { IOLog("AJZaurusUSB::USBSetMulticastFilter - allocate address buffer failed\n"); return false; } bzero(eaddrs, eaddLen); // Build the filter address buffer rnum = 0; for (i=0; i eaddLen) // Just in case { break; } for (j=0; jbytes[j]; } } // Now build the Management Element Request MER->bmRequestType = USBmakebmRequestType(kUSBOut, kUSBClass, kUSBInterface); MER->bRequest = kSet_Ethernet_Multicast_Filter; MER->wValue = count; MER->wIndex = fCommInterfaceNumber; MER->wLength = eaddLen; MER->pData = eaddrs; fMERCompletionInfo.parameter = MER; rc = fpDevice->DeviceRequest(MER, &fMERCompletionInfo); if (rc != kIOReturnSuccess) { IOLog("AJZaurusUSB::USBSetMulticastFilter - Error issueing DeviceRequest %d: %d %s\n", MER->bRequest, rc, this->stringFromReturn(rc)); IOFree(MER->pData, eaddLen); IOFree(MER, sizeof(IOUSBDevRequest)); return false; } return true; }/* end USBSetMulticastFilter */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::USBSetPacketFilter // // Inputs: // // Outputs: // // Desc: Set up and send SetEthernetPackettFilters Management Element Request(MER). // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::USBSetPacketFilter() { IOReturn rc; IOUSBDevRequest *MER; IOLog("AJZaurusUSB::USBSetPacketFilter %d\n", fPacketFilter); MER = (IOUSBDevRequest*)IOMalloc(sizeof(IOUSBDevRequest)); if (!MER) { IOLog("AJZaurusUSB::USBSetPacketFilter - allocate MER failed\n"); return false; } bzero(MER, sizeof(IOUSBDevRequest)); // Now build the Management Element Request MER->bmRequestType = USBmakebmRequestType(kUSBOut, kUSBClass, kUSBInterface); MER->bRequest = kSet_Ethernet_Packet_Filter; MER->wValue = fPacketFilter; MER->wIndex = fCommInterfaceNumber; MER->wLength = 0; MER->pData = NULL; fMERCompletionInfo.parameter = MER; rc = fpDevice->DeviceRequest(MER, &fMERCompletionInfo); if (rc != kIOReturnSuccess) { IOLog("AJZaurusUSB::USBSetPacketFilter - DeviceRequest error for %d: %d %s\n", MER->bRequest, rc, this->stringFromReturn(rc)); if (rc == kIOUSBPipeStalled) { // Clear the stall and try it once more fpDevice->GetPipeZero()->ClearPipeStall(false); rc = fpDevice->DeviceRequest(MER, &fMERCompletionInfo); if (rc != kIOReturnSuccess) { IOLog("AJZaurusUSB::USBSetPacketFilter - DeviceRequest for %d, error a second time: %d %s\n", MER->bRequest, rc, this->stringFromReturn(rc)); IOFree(MER, sizeof(IOUSBDevRequest)); return false; } } } return true; }/* end USBSetPacketFilter */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::clearPipeStall // // Inputs: thePipe - the pipe // // Outputs: // // Desc: Clear a stall on the specified pipe. All outstanding I/O // is returned as aborted. // /****************************************************************************************************/ IOReturn net_lucid_cake_driver_AJZaurusUSB::clearPipeStall(IOUSBPipe *thePipe) { UInt8 pipeStatus; IOReturn rtn = kIOReturnSuccess; IOLog("AJZaurusUSB::clearPipeStall %p\n", thePipe); pipeStatus = thePipe->GetPipeStatus(); if (pipeStatus == kPipeStalled) { rtn = thePipe->ClearPipeStall(false); if (rtn == kIOReturnSuccess) IOLog("AJZaurusUSB::clearPipeStall - Successful\n"); else IOLog("AJZaurusUSB::clearPipeStall - Failed: %d %s\n", rtn, this->stringFromReturn(rtn)); } else IOLog("AJZaurusUSB::clearPipeStall - Pipe not stalled: status=%d\n", pipeStatus); // rewritten to prevent nasty issues when doing synchronous stuff here //rtn = thePipe->ClearPipeStall(false); return rtn; }/* end clearPipeStall */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::resetDevice // // Inputs: // // Outputs: // // Desc: Check to see if we need to reset the device on wake from sleep. // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::resetDevice(void) { USBStatus status; IOLog("AJZaurusUSB::resetDevice\n"); if(!fpDevice) return; if(fpDevice->GetDeviceStatus(&status) != kIOReturnSuccess) // try to get device status { IOLog("AJZaurusUSB::resetDevice - could not get device status; needs to reset and reenumerate\n"); fpDevice->ResetDevice(); fpDevice->ReEnumerateDevice(0); } }/* end resetDevice */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::receivePacket // // Inputs: packet - the packet // size - Number of bytes in the packet // // Outputs: // // Desc: Build the mbufs and then send to the network stack. // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::receivePacket(UInt8 *packet, UInt32 size) { mbuf_t m; UInt32 submit; UInt32 fcs; #if 0 IOLog("AJZaurusUSB::receivePacket size=%lu\n", size); #endif if (size > fMax_Block_Size) { IOLog("AJZaurusUSB::receivePacket - Packet size error, packet dropped (len=%lu, expected %d)\n", size, fMax_Block_Size); if (fInputErrsOK) fpNetStats->inputErrors++; return; } // check CRC if (fChecksum) { if ((size % fOutPacketSize) == 1) { // check fcs across length minus one bytes if ((fcs = fcs_compute32(packet, size - 1, CRC32_INITFCS)) == CRC32_GOODFCS) { // success, trim extra byte and fall through --size; } // failed, check additional byte else if ((fcs = fcs_compute32(packet+size - 1, 1, fcs)) != CRC32_GOODFCS) { // failed IOLog("AJZaurusUSB::receivePacket - CRC failed on extra byte; packet (size=%lu) dropped: %08lx\n", size, fcs); if (fInputErrsOK) fpNetStats->inputErrors++; return; } // success fall through, possibly with corrected length } // normal check across full frame else if ((fcs = fcs_compute32(packet, size, CRC32_INITFCS)) != CRC32_GOODFCS) { IOLog("AJZaurusUSB::receivePacket - CRC failed; packet (size=%lu) dropped: %08lx\n", size, fcs); if (fInputErrsOK) fpNetStats->inputErrors++; return; } // trim fcs size -= 4; } // push the packet up the TCP/IP stack m = allocatePacket(size); if (m) { bcopy(packet, (unsigned char*) mbuf_data(m), size); submit = fNetworkInterface->inputPacket(m, size); #if 0 IOLog("AJZaurusUSB::receivePacket - %lu Packets submitted to IP layer\n", submit); #endif if (fInputPktsOK) fpNetStats->inputPackets++; } else { IOLog("AJZaurusUSB::receivePacket - Buffer allocation failed, packet dropped\n"); if (fInputErrsOK) fpNetStats->inputErrors++; } }/* end receivePacket */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::createWorkLoop // // Inputs: // // Outputs: return Code - true if the work loop could be created, false otherwise. // // Desc: Creates a work loop for the driver. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::createWorkLoop() { fWorkLoop = IOWorkLoop::workLoop(); IOLog("AJZaurusUSB::createWorkLoop - thread=%p workLoop=%p\n", fWorkLoop->getThread(), fWorkLoop); return (fWorkLoop != 0); }/* end createWorkLoop */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::getWorkLoop // // Inputs: // // Outputs: return Code - the work loop. // // Desc: Returns the driver's work loop. // /****************************************************************************************************/ IOWorkLoop* net_lucid_cake_driver_AJZaurusUSB::getWorkLoop() const { #if 1 IOLog("AJZaurusUSB::getWorkLoop (%p)\n", fWorkLoop); #endif return fWorkLoop; }/* end getWorkLoop */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::allocateResources // // Inputs: // // Outputs: return code - true (allocate was successful), false (it failed) // // Desc: Finishes up the rest of the configuration and gets all the endpoints open etc. // /****************************************************************************************************/ bool net_lucid_cake_driver_AJZaurusUSB::allocateResources() { IOUSBFindEndpointRequest epReq; // endPoint request struct on stack UInt32 i; #if 1 IOLog("AJZaurusUSB::allocateResources\n"); #endif // Open all the end points epReq.type = kUSBBulk; epReq.direction = kUSBIn; epReq.maxPacketSize = 0; epReq.interval = 0; fInPipe = fDataInterface->FindNextPipe(0, &epReq); if(!fInPipe) { IOLog("AJZaurusUSB::allocateResources - no bulk input pipe\n"); return false; } #if 1 IOLog("AJZaurusUSB::allocateResources - bulk input pipe - myPacketSize=%u interval=%u pipe=%p\n", epReq.maxPacketSize, epReq.interval, fInPipe); #endif epReq.direction = kUSBOut; fOutPipe = fDataInterface->FindNextPipe(0, &epReq); if(!fOutPipe) { IOLog("AJZaurusUSB::allocateResources - no bulk output pipe\n"); return false; } fOutPacketSize = epReq.maxPacketSize; #if 1 IOLog("AJZaurusUSB::allocateResources - bulk output pipe - myPacketSize=%u interval=%u pipe=%p\n", epReq.maxPacketSize, epReq.interval, fOutPipe); #endif // Interrupt pipe - Comm Interface epReq.type = kUSBInterrupt; epReq.direction = kUSBIn; fCommPipe = fCommInterface->FindNextPipe(0, &epReq); if(!fCommPipe) { IOLog("AJZaurusUSB::allocateResources - no interrupt in pipe\n"); fCommPipeMDP = NULL; fCommPipeBuffer = NULL; fLinkStatus = 1; // Mark it active cause we'll never get told return false; } #if 0 IOLog("AJZaurusUSB::allocateResources - comm pipe - myPacketSize=%u interval=%u pipe=%p\n", epReq.maxPacketSize, epReq.interval, fCommPipe); #endif // Allocate Memory Descriptor Pointer with memory for the Comm pipe: fCommPipeMDP = IOBufferMemoryDescriptor::withCapacity(COMM_BUFF_SIZE, kIODirectionIn); if (!fCommPipeMDP) return false; fCommPipeMDP->setLength(COMM_BUFF_SIZE); fCommPipeBuffer = (UInt8*)fCommPipeMDP->getBytesNoCopy(); #if 0 IOLog("AJZaurusUSB::allocateResources - comm buffer %p\n", fCommPipeBuffer); #endif // Allocate Memory Descriptor Pointer with memory for the data-in bulk pipe: fMax_Block_Size = 64*((fMax_Block_Size+(64-1))/64); // 64 is the Max Block Size we should read from the endpoint descriptor fPipeInMDP = IOBufferMemoryDescriptor::withCapacity(fMax_Block_Size, kIODirectionIn); if (!fPipeInMDP) return false; fPipeInMDP->setLength(fMax_Block_Size); fPipeInBuffer = (UInt8*)fPipeInMDP->getBytesNoCopy(); #if 1 IOLog("AJZaurusUSB::allocateResources - input buffer %p[%lu]\n", fPipeInBuffer, fPipeInMDP->getLength()); #endif // Allocate Memory Descriptor Pointers with memory for the data-out bulk pipe pool for (i=0; isetLength(fMax_Block_Size); fPipeOutBuff[i].pipeOutBuffer = (UInt8*)fPipeOutBuff[i].pipeOutMDP->getBytesNoCopy(); #if 0 IOLog("AJZaurusUSB::allocateResources - mdp=%p output buffer=%p[%u]\n", fPipeOutBuff[i].pipeOutMDP, fPipeOutBuff[i].pipeOutBuffer, fPipeOutBuff[i].pipeOutBuffer->getLength()); #endif } #if 1 IOLog("AJZaurusUSB::allocateResources - done\n"); #endif return true; }/* end allocateResources */ /****************************************************************************************************/ // // Method: net_lucid_cake_driver_AJZaurusUSB::releaseResources // // Inputs: // // Outputs: // // Desc: Frees up the resources allocated in allocateResources // /****************************************************************************************************/ void net_lucid_cake_driver_AJZaurusUSB::releaseResources() { UInt32 i; IOLog("AJZaurusUSB::releaseResources\n"); for (i=0; irelease(); fPipeOutBuff[i].pipeOutMDP = NULL; } } if (fPipeInMDP) { fPipeInMDP->release(); fPipeInMDP = 0; } if (fCommPipeMDP) { fCommPipeMDP->release(); fCommPipeMDP = 0; } }/* end releaseResources */ /* EOF */./Info.plist0000644000076500007650000002120110542017466012600 0ustar hnshns00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable AJZaurusUSB CFBundleGetInfoString MacOS X 10.4 USB driver for Linux PDAs CFBundleIconFile CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB CFBundleInfoDictionaryVersion 6.0 CFBundleName AJZaurusUSB CFBundlePackageType KEXT CFBundleShortVersionString 0.5.0 CFBundleSignature ???? CFBundleVersion 0.5.0 IOKitPersonalities Acer n30 Windows Mobile CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 5859 idVendor 1282 Letux n30/iPAQ H3900 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 42146 idVendor 1317 defaultIP 192.168.131.201 Motorola A1200 Ming CFBundleIdentifier net.lucidcake.driver.AJZaurusUSB IOClass net_lucidcake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 24717 idVendor 8888 defaultIP 192.168.131.201 Motorola Ming CFBundleIdentifier net.lucidcake.driver.AJZaurusUSB IOClass net_lucidcake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 24615 idVendor 8888 defaultIP 192.168.131.201 Motorola A780 CFBundleIdentifier net.lucidcake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 24588 idVendor 8888 defaultIP 192.168.131.201 Nokia N770 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 1073 idVendor 1057 defaultIP unknown YOPY YP3000 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 4097 idVendor 3710 Zaurus C3100 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 36944 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-5x00 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 32772 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-6000 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 36914 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-A300 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 32773 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-B500 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 32774 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-C700 CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 32775 idVendor 1245 defaultIP 192.168.129.201 Zaurus SL-C760/C860/C3000 IOProviderMergeProperties kDoNotClassMatchThisInterface CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 36913 idVendor 1245 defaultIP 192.168.129.201 iPAQ H38xx CFBundleIdentifier net.lucid-cake.driver.AJZaurusUSB IOClass net_lucid_cake_driver_AJZaurusUSB IOProbeScore 90000 IOProviderClass IOUSBDevice idProduct 20570 idVendor 1183 defaultIP 192.168.129.201 OSBundleLibraries com.apple.iokit.IONetworkingFamily 1.4.3 com.apple.iokit.IOUSBFamily 1.8 com.apple.kpi.bsd 8.0.0b2 com.apple.kpi.iokit 8.0.0b2 com.apple.kpi.libkern 8.0.0b2 com.apple.kpi.mach 8.0.0b2 com.apple.kpi.unsupported 8.0.0b1 OSBundleLibrariesDisabled OSBundleRequired Network-Root ./AJZaurusUSB.xcodeproj/0000755000076500007650000000000010542024055014676 5ustar hnshns00000000000000./AJZaurusUSB.xcodeproj/hns.mode10000644000076500007650000012277210542024055016430 0ustar hnshns00000000000000 ActivePerspectiveName Project AllowedModules BundleLoadPath MaxInstances n Module PBXSmartGroupTreeModule Name Groups and Files Outline View BundleLoadPath MaxInstances n Module PBXNavigatorGroup Name Editor BundleLoadPath MaxInstances n Module XCTaskListModule Name Task List BundleLoadPath MaxInstances n Module XCDetailModule Name File and Smart Group Detail Viewer BundleLoadPath MaxInstances 1 Module PBXBuildResultsModule Name Detailed Build Results Viewer BundleLoadPath MaxInstances 1 Module PBXProjectFindModule Name Project Batch Find Tool BundleLoadPath MaxInstances n Module PBXRunSessionModule Name Run Log BundleLoadPath MaxInstances n Module PBXBookmarksModule Name Bookmarks Tool BundleLoadPath MaxInstances n Module PBXClassBrowserModule Name Class Browser BundleLoadPath MaxInstances n Module PBXCVSModule Name Source Code Control Tool BundleLoadPath MaxInstances n Module PBXDebugBreakpointsModule Name Debug Breakpoints Tool BundleLoadPath MaxInstances n Module XCDockableInspector Name Inspector BundleLoadPath MaxInstances n Module PBXOpenQuicklyModule Name Open Quickly Tool BundleLoadPath MaxInstances 1 Module PBXDebugSessionModule Name Debugger BundleLoadPath MaxInstances 1 Module PBXDebugCLIModule Name Debug Console Description DefaultDescriptionKey DockingSystemVisible Extension mode1 FavBarConfig PBXProjectModuleGUID EE0565E108082D96001633D6 XCBarModuleItemNames XCBarModuleItems FirstTimeWindowDisplayed Identifier com.apple.perspectives.project.mode1 MajorVersion 31 MinorVersion 1 Name Default Notifications XCObserverAutoDisconnectKey XCObserverDefintionKey XCObserverFactoryKey XCPerspectivesSpecificationIdentifier XCObserverGUIDKey XCObserverProjectIdentifier XCObserverNotificationKey PBXStatusBuildStateMessageNotification XCObserverTargetKey XCMainBuildResultsModuleGUID XCObserverTriggerKey awakenModuleWithObserver: XCObserverValidationKey OpenEditors PerspectiveWidths -1 -1 Perspectives ChosenToolbarItems active-target-popup action active-buildstyle-popup NSToolbarFlexibleSpaceItem buildOrClean build-and-runOrDebug com.apple.ide.PBXToolbarStopButton get-info toggle-editor NSToolbarFlexibleSpaceItem com.apple.pbx.toolbar.searchfield ControllerClassBaseName IconName WindowOfProjectWithEditor Identifier perspective.project IsVertical Layout BecomeActive ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 089C166AFE841209C02AAC07 EE0AD2550AA02A750042DD37 EE0AD2590AA02A8F0042DD37 EE0A612A0A9DE1650042DD37 089C167CFE841241C02AAC07 F59C308D02C2AF4001000102 1C37FBAC04509CD000000102 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 14 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 632}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 650}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 0 187 1130 691 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 203pt Dock ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel Provider.cpp PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel Provider.cpp _historyCapacity 0 bookmark EE66D27D0B385FAD002421FA history EEEEB05C08083CAE000AAF1F EEEEB08308083EFB000AAF1F EE03F42C092E697200893140 EE0AD18E0A9F49210042DD37 EE0AD2620AA02AB80042DD37 EE0AD2630AA02AB80042DD37 EE0AD2640AA02AB80042DD37 EE0AD2940AA0308B0042DD37 EE95C84A0AA0393C0038E17D EE614A220B148F8E00353A17 EE614A230B148F8E00353A17 EE614A250B148F8E00353A17 EE614A260B148F8E00353A17 EE614A270B148F8E00353A17 EE614A290B148F8E00353A17 EE614A2C0B148F8E00353A17 EE5837A70B17922A00192FCC EE0E04610B189DA600F11736 EEA8E0600B18B231000552A4 EEA8E0610B18B231000552A4 EE4CC6D00B346BFF00B04C5F EE2CB40B0B385D3700065D72 EE2CB40D0B385D3700065D72 EE66D2750B385F9B002421FA EE66D2700B385F99002421FA prevStack EEEEB08408083EFB000AAF1F EE123E1A0808641C00997671 EEC7432F0892E1C5007E2EDE EEE5C632090B8FCB00F97D14 EE03F430092E697200893140 EE03F433092E697200893140 EE1450FB0A14F46500C93F94 EE1AE7E70A175FBA00753591 EE7510840A2EE1B100C453D9 EE45720F0A795AB100A7ACF7 EE0A96740A9E4A200042DD37 EE0AD2710AA02AB80042DD37 EE0AD2720AA02AB80042DD37 EE0AD2950AA0308B0042DD37 EE95C8340AA033310038E17D EE95C8510AA0393C0038E17D EE9567230B10F2BD00547728 EED32CA30B14639C001C495A EE614A350B148F8E00353A17 EE0E04660B189DA600F11736 EE0E04670B189DA600F11736 EEA8E0650B18B231000552A4 EE2CB40F0B385D3700065D72 EE66D2760B385F9B002421FA SplitCount 1 StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {922, 529}} RubberWindowFrame 0 187 1130 691 0 0 1440 878 Module PBXNavigatorGroup Proportion 529pt ContentConfiguration PBXProjectModuleGUID 1CE0B20506471E060097A5F4 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{0, 534}, {922, 116}} RubberWindowFrame 0 187 1130 691 0 0 1440 878 Module XCDetailModule Proportion 116pt Proportion 922pt Name Project ServiceClasses XCModuleDock PBXSmartGroupTreeModule XCModuleDock PBXNavigatorGroup XCDetailModule TableOfContents EE66D2780B385F9B002421FA 1CE0B1FE06471DED0097A5F4 EE66D2790B385F9B002421FA 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 ToolbarConfiguration xcode.toolbar.config.default ControllerClassBaseName IconName WindowOfProject Identifier perspective.morph IsVertical 0 Layout BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 11E0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 337}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 1 XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 355}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 373 269 690 397 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 100% Name Morph PreferredWidth 300 ServiceClasses XCModuleDock PBXSmartGroupTreeModule TableOfContents 11E0B1FE06471DED0097A5F4 ToolbarConfiguration xcode.toolbar.config.default.short PerspectivesBarVisible ShelfIsVisible SourceDescription file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' StatusbarIsVisible TimeStamp 188243885.852523 ToolbarDisplayMode 1 ToolbarIsVisible ToolbarSizeMode 1 Type Perspectives UpdateMessage The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? WindowJustification 5 WindowOrderList EE03E0E1092D110000893140 1C530D57069F1CE1000CFCEE /Users/hns/Documents/Projects/QuantumSTEP/System/Sources/AJZaurusUSB/AJZaurusUSB-0.5.0.3/AJZaurusUSB.xcodeproj WindowString 0 187 1130 691 0 0 1440 878 WindowTools FirstTimeWindowDisplayed Identifier windowTool.build IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {930, 178}} RubberWindowFrame 411 197 930 643 0 0 1440 878 Module PBXNavigatorGroup Proportion 178pt BecomeActive ContentConfiguration PBXBuildLogShowsTranscriptDefaultKey {{0, 5}, {930, 414}} PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel Build XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open 1010 GeometryConfiguration Frame {{0, 183}, {930, 419}} RubberWindowFrame 411 197 930 643 0 0 1440 878 Module PBXBuildResultsModule Proportion 419pt Proportion 602pt Name Build Results ServiceClasses PBXBuildResultsModule StatusbarIsVisible TableOfContents EE03E0E1092D110000893140 EE66D27A0B385F9B002421FA 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.build WindowString 411 197 930 643 0 0 1440 878 WindowToolGUID EE03E0E1092D110000893140 WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.debugger IsVertical Layout Dock ContentConfiguration Debugger HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {305, 162}} {{305, 0}, {389, 162}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {694, 162}} {{0, 162}, {694, 219}} LauncherConfigVersion 8 PBXProjectModuleGUID 1C162984064C10D400B95A72 PBXProjectModuleLabel Debug - GLUTExamples (Underwater) GeometryConfiguration DebugConsoleDrawerSize {100, 120} DebugConsoleVisible None DebugConsoleWindowFrame {{200, 200}, {500, 300}} DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame {{0, 0}, {694, 381}} RubberWindowFrame 110 128 694 422 0 0 1152 746 Module PBXDebugSessionModule Proportion 381pt Proportion 381pt Name Debugger ServiceClasses PBXDebugSessionModule StatusbarIsVisible TableOfContents 1CD10A99069EF8BA00B06720 EE03E0D5092D10A500893140 1C162984064C10D400B95A72 EE03E0D6092D10A500893140 EE03E0D7092D10A500893140 EE03E0D8092D10A500893140 EE03E0D9092D10A500893140 EE03E0DA092D10A500893140 EE03E0DB092D10A500893140 ToolbarConfiguration xcode.toolbar.config.debug WindowString 110 128 694 422 0 0 1152 746 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.find IsVertical Layout Dock Dock ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel Provider.cpp StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {1050, 379}} RubberWindowFrame 406 121 1050 732 0 0 1440 878 Module PBXNavigatorGroup Proportion 1050pt Proportion 379pt BecomeActive ContentConfiguration PBXProjectModuleGUID 1CD0528E0623707200166675 PBXProjectModuleLabel Project Find GeometryConfiguration Frame {{0, 384}, {1050, 307}} RubberWindowFrame 406 121 1050 732 0 0 1440 878 Module PBXProjectFindModule Proportion 307pt Proportion 691pt Name Project Find ServiceClasses PBXProjectFindModule StatusbarIsVisible TableOfContents 1C530D57069F1CE1000CFCEE EE66D2720B385F99002421FA EE66D2730B385F99002421FA 1CDD528C0622207200134675 1CD0528E0623707200166675 WindowString 406 121 1050 732 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible Identifier MENUSEPARATOR FirstTimeWindowDisplayed Identifier windowTool.debuggerConsole IsVertical Layout Dock BecomeActive ContentConfiguration PBXProjectModuleGUID 1C78EAAC065D492600B07095 PBXProjectModuleLabel Debugger Console GeometryConfiguration Frame {{0, 0}, {440, 358}} RubberWindowFrame 131 127 440 400 0 0 1152 746 Module PBXDebugCLIModule Proportion 358pt Proportion 359pt Name Debugger Console ServiceClasses PBXDebugCLIModule StatusbarIsVisible TableOfContents EE03E0DC092D10A500893140 EE03E0DD092D10A500893140 1C78EAAC065D492600B07095 WindowString 131 127 440 400 0 0 1152 746 WindowToolGUID EE03E0DC092D10A500893140 WindowToolIsVisible Identifier windowTool.run Layout Dock ContentConfiguration LauncherConfigVersion 3 PBXProjectModuleGUID 1CD0528B0623707200166675 PBXProjectModuleLabel Run Runner HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {493, 167}} {{0, 176}, {493, 267}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {405, 443}} {{414, 0}, {514, 443}} GeometryConfiguration Frame {{0, 0}, {460, 159}} RubberWindowFrame 316 696 459 200 0 0 1280 1002 Module PBXRunSessionModule Proportion 159pt Proportion 159pt Name Run Log ServiceClasses PBXRunSessionModule StatusbarIsVisible 1 TableOfContents 1C0AD2B3069F1EA900FABCE6 1C0AD2B4069F1EA900FABCE6 1CD0528B0623707200166675 1C0AD2B5069F1EA900FABCE6 ToolbarConfiguration xcode.toolbar.config.run WindowString 316 696 459 200 0 0 1280 1002 WindowToolGUID 1C0AD2B3069F1EA900FABCE6 WindowToolIsVisible 0 Identifier windowTool.scm Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAB2065D492600B07095 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1C78EAB3065D492600B07095 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {452, 0}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 Module PBXNavigatorGroup Proportion 0pt BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD052920623707200166675 PBXProjectModuleLabel SCM GeometryConfiguration ConsoleFrame {{0, 259}, {452, 0}} Frame {{0, 7}, {452, 259}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 TableConfiguration Status 30 FileName 199 Path 197.09500122070312 TableFrame {{0, 0}, {452, 250}} Module PBXCVSModule Proportion 262pt Proportion 266pt Name SCM ServiceClasses PBXCVSModule StatusbarIsVisible 1 TableOfContents 1C78EAB4065D492600B07095 1C78EAB5065D492600B07095 1C78EAB2065D492600B07095 1CD052920623707200166675 ToolbarConfiguration xcode.toolbar.config.scm WindowString 743 379 452 308 0 0 1280 1002 Identifier windowTool.breakpoints IsVertical Layout Dock BecomeActive ContentConfiguration PBXBottomSmartGroupGIDs 1C77FABC04509CD000000102 PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided no PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 168 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {168, 350}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch GeometryConfiguration Frame {{0, 0}, {185, 368}} GroupTreeTableConfiguration MainColumn 168 RubberWindowFrame 315 424 744 409 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 185pt ContentConfiguration PBXProjectModuleGUID 1CA1AED706398EBD00589147 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{190, 0}, {554, 368}} RubberWindowFrame 315 424 744 409 0 0 1440 878 Module XCDetailModule Proportion 554pt Proportion 368pt MajorVersion 2 MinorVersion 0 Name Breakpoints ServiceClasses PBXSmartGroupTreeModule XCDetailModule StatusbarIsVisible TableOfContents 1CDDB66807F98D9800BB5817 1CDDB66907F98D9800BB5817 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpoints WindowString 315 424 744 409 0 0 1440 878 WindowToolGUID 1CDDB66807F98D9800BB5817 WindowToolIsVisible Identifier windowTool.debugAnimator Layout Dock Module PBXNavigatorGroup Proportion 100% Proportion 100% Name Debug Visualizer ServiceClasses PBXNavigatorGroup StatusbarIsVisible ToolbarConfiguration xcode.toolbar.config.debugAnimator WindowString 100 100 700 500 0 0 1280 1002 Identifier windowTool.bookmarks Layout Dock Module PBXBookmarksModule Proportion 100% Proportion 100% Name Bookmarks ServiceClasses PBXBookmarksModule StatusbarIsVisible 0 WindowString 538 42 401 187 0 0 1280 1002 Identifier windowTool.classBrowser Layout Dock BecomeActive 1 ContentConfiguration OptionsSetName Hierarchy, all classes PBXProjectModuleGUID 1CA6456E063B45B4001379D8 PBXProjectModuleLabel Class Browser - NSObject GeometryConfiguration ClassesFrame {{0, 0}, {374, 96}} ClassesTreeTableConfiguration PBXClassNameColumnIdentifier 208 PBXClassBookColumnIdentifier 22 Frame {{0, 0}, {630, 331}} MembersFrame {{0, 105}, {374, 395}} MembersTreeTableConfiguration PBXMemberTypeIconColumnIdentifier 22 PBXMemberNameColumnIdentifier 216 PBXMemberTypeColumnIdentifier 97 PBXMemberBookColumnIdentifier 22 PBXModuleWindowStatusBarHidden2 1 RubberWindowFrame 385 179 630 352 0 0 1440 878 Module PBXClassBrowserModule Proportion 332pt Proportion 332pt Name Class Browser ServiceClasses PBXClassBrowserModule StatusbarIsVisible 0 TableOfContents 1C0AD2AF069F1E9B00FABCE6 1C0AD2B0069F1E9B00FABCE6 1CA6456E063B45B4001379D8 ToolbarConfiguration xcode.toolbar.config.classbrowser WindowString 385 179 630 352 0 0 1440 878 WindowToolGUID 1C0AD2AF069F1E9B00FABCE6 WindowToolIsVisible 0 ./AJZaurusUSB.xcodeproj/hns.pbxuser0000644000076500007650000010225310542024055017103 0ustar hnshns00000000000000// !$*UTF8*$! { 089C1669FE841209C02AAC07 /* Project object */ = { activeBuildConfigurationName = Default; activeTarget = EEE5C61A090B8E9400F97D14 /* Compile */; addToTargets = ( ); breakpoints = ( EE03E0DE092D10BE00893140 /* */, EE0A61370A9DE2030042DD37 /* Glue.cpp:638 */, ); codeSenseManager = EEBBA8710741181000AA3EBD /* Code sense */; perUserDictionary = { PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 200, 300, ); PBXFileTableDataSourceColumnsKey = ( PBXBookmarksDataSource_LocationID, PBXBookmarksDataSource_NameID, PBXBookmarksDataSource_CommentsID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; PBXFileTableDataSourceColumnWidthsKey = ( 22, 300, 486.5835, ); PBXFileTableDataSourceColumnsKey = ( PBXExecutablesDataSource_ActiveFlagID, PBXExecutablesDataSource_NameID, PBXExecutablesDataSource_CommentsID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 652, 20, 79, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 120, ); PBXFileTableDataSourceColumnsKey = ( PBXFindDataSource_MessageID, PBXFindDataSource_LocationID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; PBXFileTableDataSourceColumnWidthsKey = ( 16, 200, 50, 200, ); PBXFileTableDataSourceColumnsKey = ( PBXSymbolsDataSource_SymbolTypeIconID, PBXSymbolsDataSource_SymbolNameID, PBXSymbolsDataSource_SymbolTypeID, PBXSymbolsDataSource_ReferenceNameID, ); }; PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 366, 89, 20, 81, 43, 43, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXTargetDataSource_PrimaryAttribute, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, ); }; PBXPerProjectTemplateStateSaveDate = 188243831; PBXPrepackagedSmartGroups_v2 = ( { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; activationKey = OldTargetSmartGroup; clz = PBXTargetSmartGroup; description = "Displays all targets of the project."; globalID = 1C37FABC04509CD000000102; name = Targets; preferences = { image = Targets; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXTargetSmartGroup2; description = "Displays all targets of the project as well as nested build phases."; globalID = 1C37FBAC04509CD000000102; name = Targets; preferences = { image = Targets; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXExecutablesSmartGroup; description = "Displays all executables of the project."; globalID = 1C37FAAC04509CD000000102; name = Executables; preferences = { image = Executable; }; }, { " PBXTransientLocationAtTop " = bottom; absolutePathToBundle = ""; clz = PBXErrorsWarningsSmartGroup; description = "Displays files with errors or warnings."; globalID = 1C08E77C0454961000C914BD; name = "Errors and Warnings"; preferences = { fnmatch = ""; image = WarningsErrors; recursive = 1; regex = ""; root = ""; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXFilenameSmartGroup; description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; globalID = 1CC0EA4004350EF90044410B; name = "Implementation Files"; preferences = { canSave = 1; fnmatch = ""; image = SmartFolder; isLeaf = 0; recursive = 1; regex = "?*\\.[mcMC]"; root = ""; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXFilenameSmartGroup; description = "This group displays Interface Builder NIB Files."; globalID = 1CC0EA4004350EF90041110B; name = "NIB Files"; preferences = { canSave = 1; fnmatch = "*.nib"; image = SmartFolder; isLeaf = 0; recursive = 1; regex = ""; root = ""; }; }, { PBXTransientLocationAtTop = no; absolutePathToBundle = ""; clz = PBXFindSmartGroup; description = "Displays Find Results."; globalID = 1C37FABC05509CD000000102; name = "Find Results"; preferences = { image = spyglass; }; }, { PBXTransientLocationAtTop = no; absolutePathToBundle = ""; clz = PBXBookmarksSmartGroup; description = "Displays Project Bookmarks."; globalID = 1C37FABC05539CD112110102; name = Bookmarks; preferences = { image = Bookmarks; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = XCSCMSmartGroup; description = "Displays files with interesting SCM status."; globalID = E2644B35053B69B200211256; name = SCM; preferences = { image = PBXRepository; isLeaf = 0; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXSymbolsSmartGroup; description = "Displays all symbols for the project."; globalID = 1C37FABC04509CD000100104; name = "Project Symbols"; preferences = { image = ProjectSymbols; isLeaf = 1; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXFilenameSmartGroup; description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; globalID = PBXTemplateMarker; name = "Simple Filter SmartGroup"; preferences = { canSave = 1; fnmatch = "*.nib"; image = SmartFolder; isLeaf = 0; recursive = 1; regex = ""; root = ""; }; }, { PBXTransientLocationAtTop = bottom; absolutePathToBundle = ""; clz = PBXFilenameSmartGroup; description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter."; globalID = PBXTemplateMarker; name = "Simple Regular Expression SmartGroup"; preferences = { canSave = 1; fnmatch = ""; image = SmartFolder; isLeaf = 0; recursive = 1; regex = "?*\\.[mcMC]"; root = ""; }; }, { PBXTransientLocationAtTop = bottom; clz = XDDesignSmartGroup; description = "Displays Xdesign models"; globalID = 2E4A936305E6979E00701470; name = Design; preferences = { image = Design; isLeaf = 0; }; }, ); PBXWorkspaceStateSaveDate = 188243831; }; perUserProjectItems = { EE03F42C092E697200893140 = EE03F42C092E697200893140 /* PBXTextBookmark */; EE03F430092E697200893140 = EE03F430092E697200893140 /* PBXTextBookmark */; EE03F433092E697200893140 = EE03F433092E697200893140 /* PBXTextBookmark */; EE0A96740A9E4A200042DD37 = EE0A96740A9E4A200042DD37 /* PBXTextBookmark */; EE0AD18E0A9F49210042DD37 = EE0AD18E0A9F49210042DD37 /* PBXTextBookmark */; EE0AD2620AA02AB80042DD37 = EE0AD2620AA02AB80042DD37 /* PBXTextBookmark */; EE0AD2630AA02AB80042DD37 = EE0AD2630AA02AB80042DD37 /* PBXTextBookmark */; EE0AD2640AA02AB80042DD37 = EE0AD2640AA02AB80042DD37 /* PBXTextBookmark */; EE0AD2710AA02AB80042DD37 = EE0AD2710AA02AB80042DD37 /* PBXTextBookmark */; EE0AD2720AA02AB80042DD37 = EE0AD2720AA02AB80042DD37 /* PBXTextBookmark */; EE0AD2940AA0308B0042DD37 = EE0AD2940AA0308B0042DD37 /* PBXBookmark */; EE0AD2950AA0308B0042DD37 = EE0AD2950AA0308B0042DD37 /* PBXBookmark */; EE0E04610B189DA600F11736 = EE0E04610B189DA600F11736 /* PBXTextBookmark */; EE0E04660B189DA600F11736 = EE0E04660B189DA600F11736 /* PBXTextBookmark */; EE0E04670B189DA600F11736 = EE0E04670B189DA600F11736 /* PBXTextBookmark */; EE123E1A0808641C00997671 = EE123E1A0808641C00997671 /* PBXTextBookmark */; EE1450FB0A14F46500C93F94 = EE1450FB0A14F46500C93F94 /* PBXTextBookmark */; EE1AE7E70A175FBA00753591 = EE1AE7E70A175FBA00753591 /* PBXTextBookmark */; EE2CB40B0B385D3700065D72 = EE2CB40B0B385D3700065D72 /* PBXTextBookmark */; EE2CB40C0B385D3700065D72 = EE2CB40C0B385D3700065D72 /* PBXTextBookmark */; EE2CB40D0B385D3700065D72 = EE2CB40D0B385D3700065D72 /* PBXTextBookmark */; EE2CB40F0B385D3700065D72 = EE2CB40F0B385D3700065D72 /* PBXTextBookmark */; EE2CB4100B385D3700065D72 = EE2CB4100B385D3700065D72 /* PBXTextBookmark */; EE2CB4110B385D3700065D72 = EE2CB4110B385D3700065D72 /* PBXTextBookmark */; EE2CB4150B385D9400065D72 = EE2CB4150B385D9400065D72 /* PBXTextBookmark */; EE2CB4160B385D9400065D72 = EE2CB4160B385D9400065D72 /* PBXTextBookmark */; EE2CB4180B385DBE00065D72 = EE2CB4180B385DBE00065D72 /* PBXTextBookmark */; EE45720F0A795AB100A7ACF7 = EE45720F0A795AB100A7ACF7 /* PBXTextBookmark */; EE4CC6D00B346BFF00B04C5F = EE4CC6D00B346BFF00B04C5F /* PBXTextBookmark */; EE5837A70B17922A00192FCC = EE5837A70B17922A00192FCC /* PBXTextBookmark */; EE614A220B148F8E00353A17 = EE614A220B148F8E00353A17 /* PBXTextBookmark */; EE614A230B148F8E00353A17 = EE614A230B148F8E00353A17 /* PBXTextBookmark */; EE614A250B148F8E00353A17 = EE614A250B148F8E00353A17 /* PBXTextBookmark */; EE614A260B148F8E00353A17 = EE614A260B148F8E00353A17 /* PBXTextBookmark */; EE614A270B148F8E00353A17 = EE614A270B148F8E00353A17 /* PBXTextBookmark */; EE614A290B148F8E00353A17 = EE614A290B148F8E00353A17 /* PBXTextBookmark */; EE614A2C0B148F8E00353A17 = EE614A2C0B148F8E00353A17 /* PBXTextBookmark */; EE614A350B148F8E00353A17 = EE614A350B148F8E00353A17 /* PBXTextBookmark */; EE66D2700B385F99002421FA /* PBXTextBookmark */ = EE66D2700B385F99002421FA /* PBXTextBookmark */; EE66D2710B385F99002421FA /* PBXTextBookmark */ = EE66D2710B385F99002421FA /* PBXTextBookmark */; EE66D2750B385F9B002421FA /* PBXTextBookmark */ = EE66D2750B385F9B002421FA /* PBXTextBookmark */; EE66D2760B385F9B002421FA /* PBXTextBookmark */ = EE66D2760B385F9B002421FA /* PBXTextBookmark */; EE66D2770B385F9B002421FA /* PBXTextBookmark */ = EE66D2770B385F9B002421FA /* PBXTextBookmark */; EE66D27C0B385FAB002421FA /* PBXTextBookmark */ = EE66D27C0B385FAB002421FA /* PBXTextBookmark */; EE66D27D0B385FAD002421FA /* PBXTextBookmark */ = EE66D27D0B385FAD002421FA /* PBXTextBookmark */; EE7510840A2EE1B100C453D9 = EE7510840A2EE1B100C453D9 /* PBXTextBookmark */; EE75D7C30B091F1300601180 = EE75D7C30B091F1300601180 /* PBXTextBookmark */; EE8D41970A2B7767000632BC = EE8D41970A2B7767000632BC /* PBXTextBookmark */; EE9567230B10F2BD00547728 = EE9567230B10F2BD00547728 /* PBXTextBookmark */; EE95C8340AA033310038E17D = EE95C8340AA033310038E17D /* PBXTextBookmark */; EE95C84A0AA0393C0038E17D = EE95C84A0AA0393C0038E17D /* PBXTextBookmark */; EE95C8510AA0393C0038E17D = EE95C8510AA0393C0038E17D /* PBXTextBookmark */; EEA8E0600B18B231000552A4 = EEA8E0600B18B231000552A4 /* PBXTextBookmark */; EEA8E0610B18B231000552A4 = EEA8E0610B18B231000552A4 /* PBXTextBookmark */; EEA8E0650B18B231000552A4 = EEA8E0650B18B231000552A4 /* PBXTextBookmark */; EEC7432F0892E1C5007E2EDE = EEC7432F0892E1C5007E2EDE /* PBXTextBookmark */; EED32CA30B14639C001C495A = EED32CA30B14639C001C495A /* PBXTextBookmark */; EEE5C632090B8FCB00F97D14 = EEE5C632090B8FCB00F97D14 /* PBXTextBookmark */; EEEEB05C08083CAE000AAF1F = EEEEB05C08083CAE000AAF1F /* PBXTextBookmark */; EEEEB08308083EFB000AAF1F = EEEEB08308083EFB000AAF1F /* PBXTextBookmark */; EEEEB08408083EFB000AAF1F = EEEEB08408083EFB000AAF1F /* PBXTextBookmark */; }; sourceControlManager = EEBBA8700741181000AA3EBD /* Source Control */; userBuildSettings = { }; }; 089C167EFE841241C02AAC07 /* English */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1052, 497}}"; sepNavSelRange = "{183, 0}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; }; }; EE03E0DE092D10BE00893140 /* */ = { isa = PBXSymbolicBreakpoint; breakpointStyle = 0; continueAfterActions = 0; delayBeforeContinue = 0; hitCount = 0; modificationTime = 0; state = 1; symbolName = ""; }; EE03E0E7092D118700893140 /* IOService.h */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IOService.h; path = /System/Library/Frameworks/Kernel.framework/Headers/IOKit/IOService.h; sourceTree = ""; }; EE03E0EE092D1CBA00893140 /* README.rtfd */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 2686}}"; sepNavSelRange = "{396, 0}"; sepNavVisRect = "{{0, 1958}, {881, 512}}"; }; }; EE03F42C092E697200893140 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE03E0E7092D118700893140 /* IOService.h */; name = "IOService.h: 26"; rLen = 0; rLoc = 1029; rType = 0; vrLen = 1090; vrLoc = 0; }; EE03F430092E697200893140 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE03E0E7092D118700893140 /* IOService.h */; name = "IOService.h: 26"; rLen = 0; rLoc = 1029; rType = 0; vrLen = 1090; vrLoc = 0; }; EE03F433092E697200893140 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE03E0EE092D1CBA00893140 /* README.rtfd */; name = "README - Quick Installation Guide"; rLen = 34; rLoc = 0; rType = 0; vrLen = 184; vrLoc = 0; }; EE0A61350A9DE1B90042DD37 /* Glue.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1009, 8932}}"; sepNavSelRange = "{7765, 0}"; sepNavVisRect = "{{0, 2676}, {1009, 347}}"; }; }; EE0A61370A9DE2030042DD37 /* Glue.cpp:638 */ = { isa = PBXFileBreakpoint; actions = ( ); breakpointStyle = 0; continueAfterActions = 0; delayBeforeContinue = 0; fileReference = EE0A61350A9DE1B90042DD37 /* Glue.cpp */; hitCount = 1; lineNumber = 638; modificationTime = 187958194.632597; state = 2; }; EE0A96540A9E3FC00042DD37 /* Logging.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1004, 1792}}"; sepNavSelRange = "{3557, 0}"; sepNavVisRect = "{{0, 791}, {881, 497}}"; }; }; EE0A96570A9E40490042DD37 /* CRC.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 1512}}"; sepNavSelRange = "{2497, 0}"; sepNavVisRect = "{{0, 686}, {881, 497}}"; }; }; EE0A96740A9E4A200042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572130A795AE900A7ACF7 /* Power.cpp */; name = "Power.cpp: 5"; rLen = 0; rLoc = 74; rType = 0; vrLen = 1641; vrLoc = 0; }; EE0AD15C0A9F39480042DD37 /* AJZaurusUSB */ = { activeExec = 0; }; EE0AD16C0A9F39480042DD37 /* Info.plist */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 4256}}"; sepNavSelRange = "{1074, 33}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; sepNavWindowFrame = "{{608, 14}, {718, 800}}"; }; }; EE0AD16D0A9F39780042DD37 /* Driver.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1009, 5754}}"; sepNavSelRange = "{8522, 17}"; sepNavVisRect = "{{0, 3698}, {1009, 347}}"; sepNavWindowFrame = "{{15, 22}, {908, 719}}"; }; }; EE0AD18E0A9F49210042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572130A795AE900A7ACF7 /* Power.cpp */; name = "Self::setPowerState"; rLen = 48; rLoc = 2901; rType = 0; vrLen = 1089; vrLoc = 2457; }; EE0AD2620AA02AB80042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571F90A795A2500A7ACF7 /* CRC.cpp */; name = "CRC.cpp: 57"; rLen = 0; rLoc = 2425; rType = 0; vrLen = 2632; vrLoc = 2265; }; EE0AD2630AA02AB80042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A96570A9E40490042DD37 /* CRC.h */; name = "CRC.h: 61"; rLen = 0; rLoc = 2497; rType = 0; vrLen = 1138; vrLoc = 2217; }; EE0AD2640AA02AB80042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572010A795A8200A7ACF7 /* Logging.cpp */; name = "Logging.cpp: 261"; rLen = 0; rLoc = 7917; rType = 0; vrLen = 842; vrLoc = 7163; }; EE0AD2710AA02AB80042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571F90A795A2500A7ACF7 /* CRC.cpp */; name = "CRC.cpp: 57"; rLen = 0; rLoc = 2425; rType = 0; vrLen = 2632; vrLoc = 2265; }; EE0AD2720AA02AB80042DD37 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A96570A9E40490042DD37 /* CRC.h */; name = "CRC.h: 61"; rLen = 0; rLoc = 2497; rType = 0; vrLen = 1138; vrLoc = 2217; }; EE0AD2940AA0308B0042DD37 /* PBXBookmark */ = { isa = PBXBookmark; fRef = EE0AD2810AA02AC20042DD37 /* AJZaurusUSB.jpg */; }; EE0AD2950AA0308B0042DD37 /* PBXBookmark */ = { isa = PBXBookmark; fRef = EE0AD2810AA02AC20042DD37 /* AJZaurusUSB.jpg */; }; EE0E04610B189DA600F11736 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572000A795A6700A7ACF7 /* Client.cpp */; name = "Client.cpp: 480"; rLen = 0; rLoc = 16585; rType = 0; vrLen = 1276; vrLoc = 15757; }; EE0E04660B189DA600F11736 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572000A795A6700A7ACF7 /* Client.cpp */; name = "Client.cpp: 480"; rLen = 0; rLoc = 16585; rType = 0; vrLen = 1276; vrLoc = 15757; }; EE0E04670B189DA600F11736 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 61"; rLen = 0; rLoc = 1772; rType = 0; vrLen = 1055; vrLoc = 1010; }; EE123DFF0808620400997671 /* COPYING */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 4774}}"; sepNavSelRange = "{0, 0}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; }; }; EE123E000808620400997671 /* COPYING.rtf */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 4774}}"; sepNavSelRange = "{0, 0}"; sepNavVisRect = "{{0, 0}, {881, 512}}"; }; }; EE123E010808620400997671 /* fixbuild.sh */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 497}}"; sepNavSelRange = "{268, 0}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; }; }; EE123E020808620400997671 /* HOWTO-MAKE */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 1092}}"; sepNavSelRange = "{2237, 0}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; }; }; EE123E030808620400997671 /* makefile */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1112, 2058}}"; sepNavSelRange = "{1001, 0}"; sepNavVisRect = "{{0, 98}, {881, 497}}"; }; }; EE123E050808620400997671 /* WELCOME.rtf */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {797, 437}}"; sepNavSelRange = "{0, 0}"; sepNavVisRect = "{{0, 0}, {797, 437}}"; }; }; EE123E1A0808641C00997671 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E010808620400997671 /* fixbuild.sh */; name = "fixbuild.sh: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 532; vrLoc = 0; }; EE1450EB0A14F39D00C93F94 /* HISTORY.rtf */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 567}}"; sepNavSelRange = "{328, 3}"; sepNavVisRect = "{{0, 0}, {881, 512}}"; }; }; EE1450FB0A14F46500C93F94 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E020808620400997671 /* HOWTO-MAKE */; name = "----------------"; rLen = 16; rLoc = 1541; rType = 0; vrLen = 698; vrLoc = 806; }; EE1AE7E70A175FBA00753591 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123DFF0808620400997671 /* COPYING */; name = "COPYING: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1585; vrLoc = 0; }; EE2CB40B0B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EEA8E0670B18B231000552A4 /* USB.h */; name = "USB.h: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 3081; vrLoc = 14190; }; EE2CB40C0B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 94"; rLen = 0; rLoc = 3012; rType = 0; vrLen = 1254; vrLoc = 2102; }; EE2CB40D0B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD16C0A9F39480042DD37 /* Info.plist */; name = "Info.plist: 253"; rLen = 0; rLoc = 7278; rType = 0; vrLen = 1025; vrLoc = 7066; }; EE2CB40F0B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EEA8E0670B18B231000552A4 /* USB.h */; name = "USB.h: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 3081; vrLoc = 14190; }; EE2CB4100B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 94"; rLen = 0; rLoc = 3012; rType = 0; vrLen = 1254; vrLoc = 2102; }; EE2CB4110B385D3700065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD16C0A9F39480042DD37 /* Info.plist */; name = "Info.plist: 253"; rLen = 0; rLoc = 7278; rType = 0; vrLen = 1025; vrLoc = 7066; }; EE2CB4150B385D9400065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "AJZaurusUSB::USBTransmitPacket"; rLen = 31; rLoc = 34842; rType = 0; vrLen = 1249; vrLoc = 34221; }; EE2CB4160B385D9400065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "AJZaurusUSB::USBTransmitPacket"; rLen = 31; rLoc = 34842; rType = 0; vrLen = 1249; vrLoc = 34221; }; EE2CB4180B385DBE00065D72 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 32"; rLen = 0; rLoc = 1001; rType = 0; vrLen = 1140; vrLoc = 139; }; EE4571F90A795A2500A7ACF7 /* CRC.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 1386}}"; sepNavSelRange = "{2425, 0}"; sepNavVisRect = "{{0, 700}, {881, 497}}"; }; }; EE4571FA0A795A3300A7ACF7 /* Provider.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1118, 21756}}"; sepNavSelRange = "{49487, 29}"; sepNavVisRect = "{{0, 18659}, {881, 497}}"; sepNavWindowFrame = "{{38, 0}, {577, 720}}"; }; }; EE4572000A795A6700A7ACF7 /* Client.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1220, 14980}}"; sepNavSelRange = "{32861, 17}"; sepNavVisRect = "{{0, 13526}, {1009, 347}}"; sepNavWindowFrame = "{{15, 22}, {908, 719}}"; }; }; EE4572010A795A8200A7ACF7 /* Logging.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1009, 3668}}"; sepNavSelRange = "{6620, 13}"; sepNavVisRect = "{{0, 2765}, {1009, 225}}"; }; }; EE45720F0A795AB100A7ACF7 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4572010A795A8200A7ACF7 /* Logging.cpp */; name = "Logging.cpp: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1793; vrLoc = 0; }; EE4572130A795AE900A7ACF7 /* Power.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1009, 1274}}"; sepNavSelRange = "{3375, 0}"; sepNavVisRect = "{{0, 927}, {1009, 347}}"; }; }; EE4CC6D00B346BFF00B04C5F /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE03E0EE092D1CBA00893140 /* README.rtfd */; name = "README.rtfd: 12"; rLen = 0; rLoc = 396; rType = 0; vrLen = 2; vrLoc = 1104; }; EE5837A70B17922A00192FCC /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E010808620400997671 /* fixbuild.sh */; name = "fixbuild.sh: 7"; rLen = 121; rLoc = 140; rType = 0; vrLen = 540; vrLoc = 0; }; EE614A220B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE1450EB0A14F39D00C93F94 /* HISTORY.rtf */; name = for; rLen = 3; rLoc = 328; rType = 0; vrLen = 968; vrLoc = 0; }; EE614A230B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E000808620400997671 /* COPYING.rtf */; name = "COPYING.rtf: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1868; vrLoc = 0; }; EE614A250B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E050808620400997671 /* WELCOME.rtf */; name = "WELCOME.rtf: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 220; vrLoc = 0; }; EE614A260B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE75D7F10B09D5E000601180 /* prepare.gdb */; name = "prepare.gdb: 3"; rLen = 0; rLoc = 77; rType = 0; vrLen = 77; vrLoc = 0; }; EE614A270B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E020808620400997671 /* HOWTO-MAKE */; name = "HOWTO-MAKE: 78"; rLen = 0; rLoc = 2237; rType = 0; vrLen = 1054; vrLoc = 0; }; EE614A290B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123DFF0808620400997671 /* COPYING */; name = "COPYING: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1860; vrLoc = 0; }; EE614A2C0B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD2820AA02AD20042DD37 /* AJZaurusUSB.pmproj */; name = "AJZaurusUSB.pmproj: 193"; rLen = 0; rLoc = 4191; rType = 0; vrLen = 763; vrLoc = 0; }; EE614A350B148F8E00353A17 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE75D7F10B09D5E000601180 /* prepare.gdb */; name = "prepare.gdb: 3"; rLen = 0; rLoc = 77; rType = 0; vrLen = 77; vrLoc = 0; }; EE66D2700B385F99002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; rLen = 29; rLoc = 49487; rType = 0; }; EE66D2710B385F99002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "Provider.cpp: 1350"; rLen = 0; rLoc = 49438; rType = 0; vrLen = 670; vrLoc = 49158; }; EE66D2750B385F9B002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 32"; rLen = 0; rLoc = 1001; rType = 0; vrLen = 1090; vrLoc = 139; }; EE66D2760B385F9B002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E030808620400997671 /* makefile */; name = "makefile: 32"; rLen = 0; rLoc = 1001; rType = 0; vrLen = 1090; vrLoc = 139; }; EE66D2770B385F9B002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "Packets submitted to IP layer"; rLen = 29; rLoc = 49487; rType = 0; vrLen = 1085; vrLoc = 48928; }; EE66D27C0B385FAB002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "Provider.cpp: 1350"; rLen = 0; rLoc = 49438; rType = 0; vrLen = 670; vrLoc = 49158; }; EE66D27D0B385FAD002421FA /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = "Packets submitted to IP layer"; rLen = 29; rLoc = 49487; rType = 0; vrLen = 1085; vrLoc = 48928; }; EE7510840A2EE1B100C453D9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE1450EB0A14F39D00C93F94 /* HISTORY.rtf */; name = "HISTORY.rtf: 3"; rLen = 0; rLoc = 21; rType = 0; vrLen = 473; vrLoc = 0; }; EE75D7C30B091F1300601180 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5DDDE2A03B6343401A80106 /* AJZaurusUSB.h */; name = "class net_lucid_cake_driver_AJZaurusUSB : public super"; rLen = 55; rLoc = 9762; rType = 0; vrLen = 942; vrLoc = 9513; }; EE75D7F10B09D5E000601180 /* prepare.gdb */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {881, 497}}"; sepNavSelRange = "{76, 0}"; sepNavVisRect = "{{0, 0}, {881, 497}}"; }; }; EE8D41970A2B7767000632BC /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = F5DDDE2A03B6343401A80106 /* AJZaurusUSB.h */; name = kOutBuffThreshold; rLen = 17; rLoc = 5729; rType = 0; vrLen = 799; vrLoc = 5288; }; EE8DF7490808411C0087257E /* AJZaurusUSB old */ = { activeExec = 0; }; EE9567230B10F2BD00547728 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD16D0A9F39780042DD37 /* Driver.h */; name = "Driver.h: serialString"; rLen = 0; rLoc = 8475; rType = 0; vrLen = 1036; vrLoc = 7869; }; EE95C8340AA033310038E17D /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD16C0A9F39480042DD37 /* Info.plist */; name = "Info copy.plist: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1169; vrLoc = 0; }; EE95C84A0AA0393C0038E17D /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A96540A9E3FC00042DD37 /* Logging.h */; name = "Logging.h: 72"; rLen = 0; rLoc = 3557; rType = 0; vrLen = 1164; vrLoc = 3092; }; EE95C8510AA0393C0038E17D /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A96540A9E3FC00042DD37 /* Logging.h */; name = "Logging.h: 72"; rLen = 0; rLoc = 3557; rType = 0; vrLen = 1164; vrLoc = 3092; }; EEA8E0600B18B231000552A4 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0AD16D0A9F39780042DD37 /* Driver.h */; name = fDataInterface; rLen = 14; rLoc = 9095; rType = 0; vrLen = 972; vrLoc = 8361; }; EEA8E0610B18B231000552A4 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A61350A9DE1B90042DD37 /* Glue.cpp */; name = "Glue.cpp: 231"; rLen = 0; rLoc = 8773; rType = 0; vrLen = 1337; vrLoc = 8601; }; EEA8E0650B18B231000552A4 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE0A61350A9DE1B90042DD37 /* Glue.cpp */; name = "Glue.cpp: 231"; rLen = 0; rLoc = 8773; rType = 0; vrLen = 1337; vrLoc = 8601; }; EEA8E0670B18B231000552A4 /* USB.h */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = USB.h; path = /System/Library/Frameworks/Kernel.framework/Headers/IOKit/usb/USB.h; sourceTree = ""; }; EEBBA8700741181000AA3EBD /* Source Control */ = { isa = PBXSourceControlManager; fallbackIsa = XCSourceControlManager; isSCMEnabled = 0; scmConfiguration = { }; scmType = ""; }; EEBBA8710741181000AA3EBD /* Code sense */ = { isa = PBXCodeSenseManager; indexTemplatePath = ""; }; EEC7432F0892E1C5007E2EDE /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E050808620400997671 /* WELCOME.rtf */; name = "WELCOME.rtf: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 220; vrLoc = 0; }; EED32CA30B14639C001C495A /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; name = USBToHostWord; rLen = 13; rLoc = 23217; rType = 0; vrLen = 1617; vrLoc = 20558; }; EEE5C61A090B8E9400F97D14 /* Compile */ = { activeExec = 0; }; EEE5C632090B8FCB00F97D14 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EE123E000808620400997671 /* COPYING.rtf */; name = "COPYING.rtf: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 1860; vrLoc = 0; }; EEEEB05C08083CAE000AAF1F /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EEEEB05D08083CAE000AAF1F /* setjmp.h */; name = setjmp; rLen = 6; rLoc = 1656; rType = 0; vrLen = 648; vrLoc = 1380; }; EEEEB05D08083CAE000AAF1F /* setjmp.h */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = setjmp.h; path = /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/i386/setjmp.h; sourceTree = ""; }; EEEEB05F08083CAE000AAF1F /* kpi_mbuf.h */ = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = kpi_mbuf.h; path = /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/kpi_mbuf.h; sourceTree = ""; }; EEEEB08308083EFB000AAF1F /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EEEEB05F08083CAE000AAF1F /* kpi_mbuf.h */; name = "kpi_mbuf.h: 18"; rLen = 0; rLoc = 895; rType = 0; vrLen = 1152; vrLoc = 70; }; EEEEB08408083EFB000AAF1F /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = EEEEB05F08083CAE000AAF1F /* kpi_mbuf.h */; name = "kpi_mbuf.h: 18"; rLen = 0; rLoc = 895; rType = 0; vrLen = 1152; vrLoc = 70; }; F5DDDE2A03B6343401A80106 /* AJZaurusUSB.h */ = { isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AJZaurusUSB.h; path = "/Users/hns/Documents/Projects/QuantumSTEP/System/Sources/AJZaurusUSB/AJZaurusUSB-0.5.0.3/AJZaurusUSB.h"; sourceTree = ""; }; } ./AJZaurusUSB.xcodeproj/project.pbxproj0000755000076500007650000006602010542024055017761 0ustar hnshns00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXAggregateTarget section */ EEE5C61A090B8E9400F97D14 /* Compile */ = { isa = PBXAggregateTarget; buildConfigurationList = EE4D234709858ABD00136A23 /* Build configuration list for PBXAggregateTarget "Compile" */; buildPhases = ( EEE5C619090B8E9400F97D14 /* ShellScript */, ); dependencies = ( ); name = Compile; productName = Compile; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ EE0AD1610A9F39480042DD37 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; EE0AD16E0A9F39780042DD37 /* Driver.h in Headers */ = {isa = PBXBuildFile; fileRef = EE0AD16D0A9F39780042DD37 /* Driver.h */; }; EE0AD1790A9F48C30042DD37 /* Client.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE4572000A795A6700A7ACF7 /* Client.cpp */; }; EE0AD17A0A9F48C30042DD37 /* CRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE4571F90A795A2500A7ACF7 /* CRC.cpp */; }; EE0AD17B0A9F48C30042DD37 /* Glue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE0A61350A9DE1B90042DD37 /* Glue.cpp */; }; EE0AD17C0A9F48C30042DD37 /* Logging.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE4572010A795A8200A7ACF7 /* Logging.cpp */; }; EE0AD17D0A9F48C30042DD37 /* Power.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE4572130A795AE900A7ACF7 /* Power.cpp */; }; EE0AD17E0A9F48C30042DD37 /* Provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE4571FA0A795A3300A7ACF7 /* Provider.cpp */; }; EE0AD17F0A9F48CE0042DD37 /* CRC.h in Headers */ = {isa = PBXBuildFile; fileRef = EE0A96570A9E40490042DD37 /* CRC.h */; }; EE0AD1800A9F48CE0042DD37 /* Logging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE0A96540A9E3FC00042DD37 /* Logging.h */; }; EE8DF74E0808411C0087257E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; EE03E0EE092D1CBA00893140 /* README.rtfd */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; path = README.rtfd; sourceTree = ""; }; EE0A61350A9DE1B90042DD37 /* Glue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Glue.cpp; path = Sources/Glue.cpp; sourceTree = ""; }; EE0A96540A9E3FC00042DD37 /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = Sources/Logging.h; sourceTree = ""; }; EE0A96570A9E40490042DD37 /* CRC.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = CRC.h; path = Sources/CRC.h; sourceTree = ""; }; EE0AD16B0A9F39480042DD37 /* AJZaurusUSB.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AJZaurusUSB.kext; sourceTree = BUILT_PRODUCTS_DIR; }; EE0AD16C0A9F39480042DD37 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; EE0AD16D0A9F39780042DD37 /* Driver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Driver.h; path = Sources/Driver.h; sourceTree = ""; }; EE0AD2810AA02AC20042DD37 /* AJZaurusUSB.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = AJZaurusUSB.jpg; sourceTree = ""; }; EE0AD2820AA02AD20042DD37 /* AJZaurusUSB.pmproj */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = AJZaurusUSB.pmproj; sourceTree = ""; }; EE123DFF0808620400997671 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; EE123E000808620400997671 /* COPYING.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = COPYING.rtf; sourceTree = ""; }; EE123E010808620400997671 /* fixbuild.sh */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = fixbuild.sh; sourceTree = ""; }; EE123E020808620400997671 /* HOWTO-MAKE */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = "HOWTO-MAKE"; sourceTree = ""; }; EE123E030808620400997671 /* makefile */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.make; path = makefile; sourceTree = ""; }; EE123E050808620400997671 /* WELCOME.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = WELCOME.rtf; sourceTree = ""; }; EE1450EB0A14F39D00C93F94 /* HISTORY.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = HISTORY.rtf; sourceTree = ""; }; EE4571F90A795A2500A7ACF7 /* CRC.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = CRC.cpp; path = Sources/CRC.cpp; sourceTree = ""; }; EE4571FA0A795A3300A7ACF7 /* Provider.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Provider.cpp; path = Sources/Provider.cpp; sourceTree = ""; }; EE4572000A795A6700A7ACF7 /* Client.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Client.cpp; path = Sources/Client.cpp; sourceTree = ""; }; EE4572010A795A8200A7ACF7 /* Logging.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Logging.cpp; path = Sources/Logging.cpp; sourceTree = ""; }; EE4572130A795AE900A7ACF7 /* Power.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Power.cpp; path = Sources/Power.cpp; sourceTree = ""; }; EE75D7F10B09D5E000601180 /* prepare.gdb */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = prepare.gdb; sourceTree = ""; }; EE8DF7550808411C0087257E /* AJZaurusUSB.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AJZaurusUSB.kext; sourceTree = BUILT_PRODUCTS_DIR; }; F59C308D02C2AF4001000102 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ EE0AD1640A9F39480042DD37 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; EE8DF7510808411C0087257E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 089C166AFE841209C02AAC07 /* AppleUSBCDCEthernet */ = { isa = PBXGroup; children = ( EE1450EB0A14F39D00C93F94 /* HISTORY.rtf */, EE0AD2550AA02A750042DD37 /* Packaging */, EE0AD2590AA02A8F0042DD37 /* Making */, EE0A612A0A9DE1650042DD37 /* Separated into Modules */, 089C167CFE841241C02AAC07 /* Resources */, 19C28FB6FE9D52B211CA2CBB /* Products */, F59C308D02C2AF4001000102 /* Kernel.framework */, ); name = AppleUSBCDCEthernet; sourceTree = ""; }; 089C167CFE841241C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( EE0AD16C0A9F39480042DD37 /* Info.plist */, 089C167DFE841241C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 19C28FB6FE9D52B211CA2CBB /* Products */ = { isa = PBXGroup; children = ( EE8DF7550808411C0087257E /* AJZaurusUSB.kext */, EE0AD16B0A9F39480042DD37 /* AJZaurusUSB.kext */, ); name = Products; sourceTree = ""; }; EE0A612A0A9DE1650042DD37 /* Separated into Modules */ = { isa = PBXGroup; children = ( EE4572000A795A6700A7ACF7 /* Client.cpp */, EE0A96570A9E40490042DD37 /* CRC.h */, EE4571F90A795A2500A7ACF7 /* CRC.cpp */, EE0AD16D0A9F39780042DD37 /* Driver.h */, EE0A61350A9DE1B90042DD37 /* Glue.cpp */, EE0A96540A9E3FC00042DD37 /* Logging.h */, EE4572010A795A8200A7ACF7 /* Logging.cpp */, EE4572130A795AE900A7ACF7 /* Power.cpp */, EE4571FA0A795A3300A7ACF7 /* Provider.cpp */, ); name = "Separated into Modules"; sourceTree = ""; }; EE0AD2550AA02A750042DD37 /* Packaging */ = { isa = PBXGroup; children = ( EE0AD2810AA02AC20042DD37 /* AJZaurusUSB.jpg */, EE0AD2820AA02AD20042DD37 /* AJZaurusUSB.pmproj */, EE123E000808620400997671 /* COPYING.rtf */, EE03E0EE092D1CBA00893140 /* README.rtfd */, EE123E050808620400997671 /* WELCOME.rtf */, ); name = Packaging; sourceTree = ""; }; EE0AD2590AA02A8F0042DD37 /* Making */ = { isa = PBXGroup; children = ( EE123DFF0808620400997671 /* COPYING */, EE123E010808620400997671 /* fixbuild.sh */, EE123E020808620400997671 /* HOWTO-MAKE */, EE123E030808620400997671 /* makefile */, EE75D7F10B09D5E000601180 /* prepare.gdb */, ); name = Making; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ EE0AD15E0A9F39480042DD37 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( EE0AD17F0A9F48CE0042DD37 /* CRC.h in Headers */, EE0AD1800A9F48CE0042DD37 /* Logging.h in Headers */, EE0AD16E0A9F39780042DD37 /* Driver.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; EE8DF74B0808411C0087257E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ EE0AD15C0A9F39480042DD37 /* AJZaurusUSB */ = { isa = PBXNativeTarget; buildConfigurationList = EE0AD1670A9F39480042DD37 /* Build configuration list for PBXNativeTarget "AJZaurusUSB" */; buildPhases = ( EE0AD15D0A9F39480042DD37 /* ShellScript */, EE0AD15E0A9F39480042DD37 /* Headers */, EE0AD1600A9F39480042DD37 /* Resources */, EE0AD1620A9F39480042DD37 /* Sources */, EE0AD1640A9F39480042DD37 /* Frameworks */, EE0AD1650A9F39480042DD37 /* Rez */, EE0AD1660A9F39480042DD37 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = AJZaurusUSB; productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Extensions"; productName = AppleUSBCDCEthernet; productReference = EE0AD16B0A9F39480042DD37 /* AJZaurusUSB.kext */; productType = "com.apple.product-type.kernel-extension.iokit"; }; EE8DF7490808411C0087257E /* AJZaurusUSB old */ = { isa = PBXNativeTarget; buildConfigurationList = EE4D234B09858ABD00136A23 /* Build configuration list for PBXNativeTarget "AJZaurusUSB old" */; buildPhases = ( EE8DF74A0808411C0087257E /* ShellScript */, EE8DF74B0808411C0087257E /* Headers */, EE8DF74D0808411C0087257E /* Resources */, EE8DF74F0808411C0087257E /* Sources */, EE8DF7510808411C0087257E /* Frameworks */, EE8DF7520808411C0087257E /* Rez */, EE8DF7530808411C0087257E /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = "AJZaurusUSB old"; productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Extensions"; productName = AppleUSBCDCEthernet; productReference = EE8DF7550808411C0087257E /* AJZaurusUSB.kext */; productType = "com.apple.product-type.kernel-extension.iokit"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 089C1669FE841209C02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = EE4D234F09858ABD00136A23 /* Build configuration list for PBXProject "AJZaurusUSB" */; hasScannedForEncodings = 1; mainGroup = 089C166AFE841209C02AAC07 /* AppleUSBCDCEthernet */; projectDirPath = ""; targets = ( EEE5C61A090B8E9400F97D14 /* Compile */, EE8DF7490808411C0087257E /* AJZaurusUSB old */, EE0AD15C0A9F39480042DD37 /* AJZaurusUSB */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ EE0AD1600A9F39480042DD37 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( EE0AD1610A9F39480042DD37 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; EE8DF74D0808411C0087257E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( EE8DF74E0808411C0087257E /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ EE0AD1650A9F39480042DD37 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; EE8DF7520808411C0087257E /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ EE0AD15D0A9F39480042DD37 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPreprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi"; }; EE0AD1660A9F39480042DD37 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPostprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi\ncp -R build/Default/*.kext pkg"; }; EE8DF74A0808411C0087257E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPreprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi"; }; EE8DF7530808411C0087257E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "script=\"${SYSTEM_DEVELOPER_DIR}/ProjectBuilder Extras/Kernel Extension Support/KEXTPostprocess\";\nif [ -x \"$script\" ]; then\n . \"$script\"\nfi\ncp -R build/Default/*.kext pkg"; }; EEE5C619090B8E9400F97D14 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# shell script goes here\nopen -a Terminal .\nexit 0"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ EE0AD1620A9F39480042DD37 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( EE0AD1790A9F48C30042DD37 /* Client.cpp in Sources */, EE0AD17A0A9F48C30042DD37 /* CRC.cpp in Sources */, EE0AD17B0A9F48C30042DD37 /* Glue.cpp in Sources */, EE0AD17C0A9F48C30042DD37 /* Logging.cpp in Sources */, EE0AD17D0A9F48C30042DD37 /* Power.cpp in Sources */, EE0AD17E0A9F48C30042DD37 /* Provider.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; EE8DF74F0808411C0087257E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C167EFE841241C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ EE0AD1680A9F39480042DD37 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 0.2.8; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OPTIMIZATION_CFLAGS = "-O0"; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; ZERO_LINK = YES; }; name = Development; }; EE0AD1690A9F39480042DD37 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 0.2.8; FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; ZERO_LINK = NO; }; name = Deployment; }; EE0AD16A0A9F39480042DD37 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = ""; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; }; name = Default; }; EE4D234809858ABD00136A23 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 0.2.8; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; OPTIMIZATION_CFLAGS = "-O0"; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = Compile; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); ZERO_LINK = YES; }; name = Development; }; EE4D234909858ABD00136A23 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 0.2.8; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = Compile; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); ZERO_LINK = NO; }; name = Deployment; }; EE4D234A09858ABD00136A23 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = Compile; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); }; name = Default; }; EE4D234C09858ABD00136A23 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 0.2.8; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info old.plist"; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OPTIMIZATION_CFLAGS = "-O0"; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; ZERO_LINK = YES; }; name = Development; }; EE4D234D09858ABD00136A23 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 0.2.8; FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_PEDANTIC = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info old.plist"; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; ZERO_LINK = NO; }; name = Deployment; }; EE4D234E09858ABD00136A23 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = ""; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "Info old.plist"; INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions"; KERNEL_MODULE = YES; LIBRARY_SEARCH_PATHS = ""; MODULE_IOKIT = YES; MODULE_NAME = "net.lucid-cake.driver.AJZaurusUSB"; MODULE_VERSION = 0.3.2; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRODUCT_NAME = AJZaurusUSB; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = kext; }; name = Default; }; EE4D235009858ABD00136A23 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Development; }; EE4D235109858ABD00136A23 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Deployment; }; EE4D235209858ABD00136A23 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ EE0AD1670A9F39480042DD37 /* Build configuration list for PBXNativeTarget "AJZaurusUSB" */ = { isa = XCConfigurationList; buildConfigurations = ( EE0AD1680A9F39480042DD37 /* Development */, EE0AD1690A9F39480042DD37 /* Deployment */, EE0AD16A0A9F39480042DD37 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; EE4D234709858ABD00136A23 /* Build configuration list for PBXAggregateTarget "Compile" */ = { isa = XCConfigurationList; buildConfigurations = ( EE4D234809858ABD00136A23 /* Development */, EE4D234909858ABD00136A23 /* Deployment */, EE4D234A09858ABD00136A23 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; EE4D234B09858ABD00136A23 /* Build configuration list for PBXNativeTarget "AJZaurusUSB old" */ = { isa = XCConfigurationList; buildConfigurations = ( EE4D234C09858ABD00136A23 /* Development */, EE4D234D09858ABD00136A23 /* Deployment */, EE4D234E09858ABD00136A23 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; EE4D234F09858ABD00136A23 /* Build configuration list for PBXProject "AJZaurusUSB" */ = { isa = XCConfigurationList; buildConfigurations = ( EE4D235009858ABD00136A23 /* Development */, EE4D235109858ABD00136A23 /* Deployment */, EE4D235209858ABD00136A23 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 089C1669FE841209C02AAC07 /* Project object */; } ./English.lproj/0000755000076500007650000000000010126107463013345 5ustar hnshns00000000000000./English.lproj/InfoPlist.strings0000755000076500007650000000156010526417517016704 0ustar hnshns00000000000000/* Localized versions of Info.plist keys */ CFBundleName = "AJZaurusUSB"; CFBundleShortVersionString = "AJZaurusUSB version 0.5.0"; CFBundleGetInfoString = "AJZaurusUSB version 0.5.0, Copyright 2002-2004 Andreas Junghans & 2005-2006 Nikolaus Schaller, based on USBCDCEthernet, Copyright 1998-2002 Apple"; NSHumanReadableCopyright = "Copyright 2002-2004 Andreas Junghans, Copyright 2005-2006 Nikolaus Schaller, Copyright 1998-2002 Apple"; ./AJZaurusUSB.pmproj0000644000076500007650000000417410542022623014140 0ustar hnshns00000000000000bplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver Troot? %+158NTUX\]abgklpquxDcU$null  !"$^documentFormatYbuildPathYresources_requirementsPlist_requirementsVolumeCheckScript\pathMappingsTinfoV$classTdesc_fileFilterPatterns_requirementsInstallCheckScript_locatorDefinitions ;>6<&'()*ZNS.objectsWNS.keys,-./X$classesZ$classname/0\NSDictionaryXNSObject&'234,-677/0_NSMutableDictionary9:;<=>?@ABCDEFG IJKLMYalignmentWscalingWlicenseZconclusion_localizedMimeResourcesUmodelZbackgroundVreadmeWwelcomeVextras  OP>DQ STtypeTpath [WELCOME.rtf,-VWW0YLocalPathOP>DY S  [README.rtfdOP>D^ S  [COPYING.rtfOP>c S OP>Dh S _AJZaurusUSB.jpgOP>Dm S P&'rs4,-vww0YResources&'y4z{{}~{{}())*+-/)023)4/*//5 !"#$%&']preserveForks[followLinks]removeDSStore\allowBackRevXcontentsYtempBuildZinstallFat^rootVolumeOnly_installLocationWgetInfo]authorizationXcompressZidentifier_overwritePermissionsZonFinished[relocatableXrequired\shortVersion OP>D S, SpkgOP>c S. T/tmpOP>c S1 _/System/Library/Extensions_AJ Zaurus USB driver_ net.lucidcake.driver.AJZaurusUSBU0.5.0&'4ʀ9:̀78[descriptionUtitle_cThis installs an USB driver into the kernel so that your Sharp Zaurus can communicate with MacOS X.[AJZaurusUSB_h/Users/hns/Documents/Projects/QuantumSTEP/System/Sources/AJZaurusUSB/AJZaurusUSB-0.5.0.3/AJZaurusUSB.pkg&֠=,-٣0^NSMutableArrayWNSArray,-ݣ0WSPModelVPModel$)2DILQS $)>_tvxz|~'/7B[als{!#%7@BDFGNOPRWZdk'2AS[ir}-/RX_bdfikmo{^cdfko~./Zaurus.term0000644000076500007650000001316110232406062013006 0ustar hnshns00000000000000 WindowSettings AutoFocus YES Autowrap YES BackgroundImagePath Backwrap YES Bell YES BlinkCursor NO BlinkText YES CleanCommands rlogin;telnet;ssh;slogin Columns 163 CursorShape 0 CustomTitle ssh -l root 192.168.129.201 DeleteKeySendsBackspace NO DisableAnsiColors NO DoubleBold YES DoubleColumnsForDoubleWide NO DoubleWideChars YES EnableDragCopy YES ExecutionString FontAntialiasing NO FontHeightSpacing 1 FontWidthSpacing 1 IsMiniaturized NO KeyBindings $F708 [25~ $F709 [26~ $F70A [28~ $F70B [29~ $F70C [31~ $F70D [22~ $F70E [33~ $F70F [34~ $F729  $F72B  $F72C [5~ $F72D [6~ F704 OP F705 OQ F706 OR F707 OS F708 [15~ F709 [17~ F70A [18~ F70B [19~ F70C [20~ F70D [21~ F70E [23~ F70F [24~ F710 [25~ F711 [26~ F712 [28~ F713 [29~ F714 [31~ F715 [32~ F716 [33~ F717 [34~ F728 [3~ F729 scrollToBeginningOfDocument: F72B scrollToEndOfDocument: F72C scrollPageUp: F72D scrollPageDown: ^F702  ^F703  ~F704 [17~ ~F705 [18~ ~F706 [19~ ~F707 [20~ ~F708 [21~ ~F709 [23~ ~F70A [24~ ~F70B [25~ ~F70C [26~ ~F70D [28~ ~F70E [29~ ~F70F [31~ ~F710 [32~ ~F711 [33~ ~F712 [34~ Meta -1 NSFixedPitchFont Monaco NSFixedPitchFontSize 10 OptionClickToMoveCursor NO PadBottom 3 PadLeft 5 PadRight 3 PadTop 3 RewrapOnResize YES Rows 29 SaveLines 10000 ScrollRegionCompat NO ScrollRows 0 Scrollback YES Scrollbar YES Shell ssh -l root 192.168.129.201 ShellExitAction 2 StrictEmulation NO StringEncoding 4 TermCapString xterm-color TerminalOpaqueness 1 TextColors 0.000 0.000 0.000 1.000 1.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 1.000 1.000 0.000 0.000 0.000 0.666 0.666 0.666 0.333 0.333 0.333 TitleBits 8 Translate YES UseCtrlVEscapes YES VisualBell NO WinLocULY 713 WinLocX 31 WinLocY 0 WindowCloseAction 1 ./prepare.gdb0000755000076500007650000000011510526317535012752 0ustar hnshns00000000000000add-symbol-file pkg/net.lucid-cake.driver.AJZaurusUSB.sym target remote-kdp